假设物品的编号是从1到n,记录物品重量的数组为w,记录物品价值的数组为v,一件一件物品考虑是否放入背包。
定义一个用于动态规划的数组dp,dp[x][y]代表前x件物品,不超过重量y的时候的最大价值。(注意,dp数组大小最好设置成w.length+1,y+1)
第x件物品有两种情况,选或者不选:
一、选择第x件物品,前x-1件物品的重量不能超过y-w[x]
二、不选择第x件物品,前x-1件物品重量不能超过y
这两种情况不一定谁的价值最大,所以这两种可能性应该选择价值最大的可能,也就是dp[x][y]=max{dp[x-1][y],dp[x-1][y-w[x]]+v[x]}
遍历赋值一遍dp数组即可。
实现代码为:
public class test3 {
public static void main(String[] args) {
int[] w={200,600,100,180,300,450};
int[] v={6,10,3,4,5,8};
int x=w.length;
int y=1000;
int[][] temp=new int[x+1][1001];
for(int i=1;i<x+1;i++){
for(int j=1;j<1001;j++){
if(j-w[i-1]>=0){
temp[i][j]= Math.max(temp[i-1][j],temp[i-1][j-w[i-1]]+v[i-1]);
}else{
temp[i][j]=temp[i-1][j];
}
}
}
System.out.println(temp[x][y]);
}
}