算法学习——动态规划 例题:背包问题(java)

题目:

一个背包有一定的承重W,用N件物品,每件都有自己的价值,记录在数组V中, 也都有自己的重量,记录在数组W中,每件物品只能选择要装入的背包还是不装入背包 , 要求在不超过背包承重的前提下选出物品的总价值最大

动态规划思想:假设物品从1到N,一件一件物品考虑是否加入背包
递推关系式:     1) j<w(i) V(i,j)=V(i-1,j)     2) j>=w(i) V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }

public class DTGH_Backpack {
    public int backpack(int bw,int[] v,int[] w) {
        int[][] dp=new int[v.length][bw+1];
        for (int i = 0; i <dp[0].length ; i++) {
            if (w[0]<=i){
                for (int j = i; j <dp[0].length ; j++) {
                    dp[0][j]=v[0];
                }
                break;
            }
        }
        for (int i = 1; i <dp.length ; i++) {
            for (int j = 1; j <dp[0].length ; j++) {
                if (j>=w[i]) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j-w[i]]+v[i]);
                }else {
                    dp[i][j]=dp[i - 1][j];
                }
            }
        }
        return dp[dp.length-1][dp[0].length-1];

    }

    public static void main(String[] args) {
        DTGH_Backpack a=new DTGH_Backpack();
        int[] v={100,1,2};
        int[] w={71,69,1};
        System.out.println(a.backpack(71,v,w));
    }
}

猜你喜欢

转载自blog.csdn.net/microopithecus/article/details/85394715