有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
class Solution {
public static void main(String[] args) {
int[] weight = {1, 3, 4};
int[] value = {15, 20, 30};
int bagWight = 4;
testWeightBagProblem(weight, value, bagWight);
}
public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){
int weightLen = weight.length;
//定义dp数组:dp[j]表示背包容量为j时,从0-i物品随意拿取能获得的最大价值
int[] dp = new int[bagWeight + 1];
//遍历顺序:先遍历物品,再遍历背包容量
for (int i = 0; i < weightLen; i++){
/*
j为背包容量,dp[j]为当前包中物品价值
两种情况:不放当前物品,放当前物品
i = 0时从下标0-0中取物品,计算背包最大价值
此时的dp为[0,0,0,0,0],j >= 1
dp[4] = max(dp[4],dp[4 - 1] + 20) = 15
dp[3] = max(dp[3],dp[3 - 1] + 20) = 15
dp[2] = max(dp[2],dp[2 - 1] + 20) = 15
dp[1] = max(dp[1],dp[1 - 1] + 20) = 15
i = 1时从0-1中取物品,计算背包最大价值
此时的dp为[0,15,15,15,15],j >= 3
dp[4] = max(dp[4],dp[4 - 3] + 20) = 35
dp[3] = max(dp[3],dp[3 - 3] + 20) = 20
i = 2时从0-2中取物品,计算背包最大价值
此时的dp为[0,15,15,20,35],j >= 4
dp[4] = max(dp[4],dp[4 - 4] + 30) = 35
最终遍历结果
[0,15,15,15,15]
*/
for (int j = bagWeight; j >= weight[i]; j--){
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
//打印dp数组
for (int j = 0; j <= bagWeight; j++){
System.out.print(dp[j] + " ");
}
}
5823

被折叠的 条评论
为什么被折叠?



