思路
1.定义dp数组
dp[j]:表示为背包容量为j时的最大价值。
2.递推公式
当weight[i]的重量比当前背包的容量小时,说明当前背包可以将物品i放入进来,此时dp[j]=dp[j-物品i的重量]+物品i的价值。此时也可以选择不放进来,则dp[j] = dp[j]。最后dp[j]为二者中最大的。
3.dp数组初始化
dp[0]就是背包容量为0时的价值。应该为0;
4.遍历顺序
倒序遍历是为了保证物品i只被放入一次!如果正序遍历的话,在计算dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i])时,就会将前一个物品再次放入。当j=1时,dp[1] = 15;当j=2时,dp[2] = 30,即将物品1重复计算
5.打印顺序
最后的结果就是在数组的最后一个元素。
代码
public void Test01bag(){
int[] weight = {1, 3, 4};
int[] value = {15, 20, 30};
int bagsize = 4;
int dp[] = new int[bagsize+1];
dp[0] = 0;
for (int i = 0;i<weight.length;i++){
for (int j = bagsize;j>=weight[i];j--]){
dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i]);
}
}
//打印dp数组
for (int j = 0; j <= bagsize; j++){
System.out.print(dp[j] + " ");
}
}