0-1背包问题 完全背包问题 附动态规划过程图和代码

【题目】
链接:https://www.nowcoder.com/questionTerminal/15bdb1bacb1843f381102ee609577385
来源:牛客网

考虑一个有n=5个物品的背包问题实例,背包的容量m=10,v(价值)=(6,3,5,4,6),并且w(重量)=(2,2,6,5,4),请问不超过sw(背包能承受的总重)的情况下,最大的放入价值是多少()
【0-1背包问题】就是物品只能放一次,要么放要么不放。
【完全背包问题】物品可以无限放
【多重背包问题】有n1个物品a1,n2个物品a2,放进背包里,可以转成0-1背包问题,相当于有重复的a1,a2
【求解】
都用动态规划做,0-1背包问题和完全背包问题解法是一样的,就是填表的时候值不一样。
新建一个二维表dp,行数是n的值,列数是sw + 1。
dp[i][j]表示前i种物品,背包能承受的重量是j的时候,放入物品的最大价值。
dp[n-1][sw]就是5个物品,背包总重不超过sw,最大放入的价值,就是所求的解。

这里的用例参考了这篇文章http://www.cnblogs.com/fengziwei/p/7750849.html
自己画图填表格
0-1背包问题 完全背包问题 附动态规划过程图和代码_第1张图片

public class Main {
    public static void main(String[] args) {
        int n = 5;
        int[] w = {2,2,6,5,4};
        int[] v = {6,3,5,4,6};
        int sw = 10;
        int[][] dp = new int[n][sw + 1];
        for (int i = 0; i <= sw; i++) {
            if (i < w[0]) {
                dp[0][i] = 0;
            } else {
                dp[0][i] = v[0];
            }
        }
        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= sw; j++) {
                if (j < w[i]) {
                    dp[i][j] = dp[i-1][j];
                } else {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j- w[i]] + v[i]);
                }
            }
        }
        System.out.println(dp[n-1][sw]);
    }
}

完全背包问题的用例是参考这篇博客https://www.cnblogs.com/A1269180380/p/6344043.html
画图填数组
0-1背包问题 完全背包问题 附动态规划过程图和代码_第2张图片

public class Main1 {
    public static void main(String[] args) {
        int n = 4, sw = 10;
        int[] w = {2, 3, 4, 7};
        int[] v = {1, 3, 5, 9};
        int[][] dp = new int[n][sw + 1];
        for (int i = 0; i <= sw; i++) {
            dp[0][i] = (i / w[0]) * v[0];
        }
        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= sw; j++) {
                if (j < w[i]) {
                    dp[i][j] = dp[i-1][j];
                } else {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
                }
            }
        }
        System.out.println(dp[n-1][sw]);
    }

}

你可能感兴趣的:(数据结构与算法)