美文网首页数据结构与算法
动态规划--背包问题

动态规划--背包问题

作者: 暮想sun | 来源:发表于2019-12-30 17:02 被阅读0次

一个背包的总容量为V,现在有N类物品,第i类物品的重量为weight[i],价值为value[i]。那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大?

0-1背包

每类物品最多只能装一次

    /**
     * 0-1背包问题
     *
     * 根据动态规划网格图,制定价值矩阵,第n个物品在v容量小的价值
     * dp[i][j] = (dp[i-1][j] > (dp[i-1][j-weight[i -1]]+value[i-1]))
     * ? dp[i-1][j]:(dp[i-1][j-weight[i-1]]+value[i-1])
     *
     * @param v      背包容量
     * @param n      物品种类
     * @param weight 物品重量
     * @param value  物品价值
     * @return
     */
    public static String zeroOnePack(int v, int n, int[] weight, int[] value) {

        //dp的数值,表示价值总和
        int[][] dp = new int[n + 1][v + 1];
        //i是物品,j是容量
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= v; j++) {
                //判断背包的重量是否超重,超重的情况下,最大价值,为上一个最大价值。
                if (weight[i - 1] > j) {
                    dp[i][j] = dp[i - 1][j];
                    continue;
                }
                
                //背包的当前容量的最大价值,与装入当前物品+恰能装进当前物品的容量的最大值。
                if (dp[i - 1][j] > dp[i - 1][j - weight[i - 1]] + value[i - 1]) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j - weight[i - 1]] + value[i - 1];
                }

            }

        }

        int j = v;
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = n; i > 0; i--) {
            if (dp[i][j] > dp[i - 1][j]) {
                stringBuilder.append(i);
                j = j - weight[i - 1];
            }
        }

        return stringBuilder.toString();

    }

多重背包问题

物品数量有限制

    public static int manyPack(int v, int n, int[] weight, int[] value, int[] num) {
        //dp的数值,表示价值总和
        int[][] dp = new int[n + 1][v + 1];

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= v; j++) {

                if (weight[i - 1] > j) {
                    dp[i][j] = dp[i - 1][j];
                    continue;
                }

                //判断该物品在什么数量的情况下价值最大
                int maxV = Math.min(num[i - 1], j / weight[i - 1]);
                for (int k = 0; k <= maxV; k++) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - k * weight[i - 1]] + k * value[i - 1]);
                }

            }

        }

        return dp[n][v];
    }

完全背包问题

每个物品数量无限制

    /**
     * 完全背包问题
     * 每个物品数量无限制
     *
     * 考虑di N行时,n产品可以考虑继续加入
     * dp[i][j] = (dp[i-1][j] > (dp[i][j-weight[i -1]]+value[i-1]))
     * ? dp[i-1][j]:(dp[i][j-weight[i-1]]+value[i-1])
     *
     * @param v
     * @param n
     * @param weight
     * @param value
     * @return
     */
    public static int completePack(int v, int n, int[] weight, int[] value) {

        //dp的数值,表示价值总和
        int[][] dp = new int[n + 1][v + 1];

        for (int i = 1; i <= n; i++) {

            for (int j = 1; j <= v; j++) {

                if (weight[i - 1] > j) {
                    dp[i][j] = dp[i - 1][j];
                    continue;
                }
                //当前物品加入判断价值行列
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - weight[i - 1]] + value[i - 1]);

            }

        }

        return dp[n][v];

    }

相关文章

  • 算法学习收藏

    动态规划问题 动态规划(最优子结构和重叠子问题的比较) 动态规划解决01背包问题 01背包问题 最优二叉查找树 《...

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

  • 2019-07-10 数据结构和算法(妙味杜鹏)

    八皇后 A *寻路 背包问题(动态规划方法) 背包问题(贪心算法)

  • 动态规划

    0-1背包问题 自己实现的0-1背包问题的动态规划解法,先贴上吧,动态规划原理解释有空再写。

  • 2022-02-19 动态规划高频题专题【1】

    动态规划基本类型 dp基础 背包问题 打家劫舍 股票问题 子序列问题 进阶动态规划 深入理解动态规划过程 定义dp...

  • 动态规划.背包问题

    动态规划 之 0-1背包问题 【背包问题】 现有n个物品,价值为`$$v_1,v_2....v_n$$ 重量为 现...

  • 动态规划 背包问题

    1.问题描述 有n个物体有重量和价值两个属性,一个能承重一定重量的背包。问怎么选择物体能实现背包里的价值最大化。 ...

  • 动态规划 背包问题

    本篇博文参考此博文,该博文PPT非常有助理解 问题描述:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背...

  • 背包问题(动态规划)

    原理参见 屈婉玲老师 算法设计与分析 ORZ

  • 动态规划:背包问题

    动态规划,都可以画网格解决! 背包问题 假设你是个小偷,背着一个可装4 磅东西的背包。你可盗窃的商品有如下3 件:...

网友评论

    本文标题:动态规划--背包问题

    本文链接:https://www.haomeiwen.com/subject/rjumoctx.html