题目
一共有N件物品,第i(i从1开始)件物品的重量为weights[i],价值为values[i]。在总重量不超过背包承载上限size的情况下,能够装入背包的最大价值是多少?
思路
dp[i][j]代表前i个物品在容量j背包下的最大价值
1.第i个物品无法放下
dp[i][j] = dp[i - 1][j] // 前i-1个物品在j容量下的dp
2.可以放下
a.放下了
dp[i][j] = dp[i - 1][j - weights[i]] + values[i] // 前i-1个物品在j-weights[i]容量下的dp+values[i]
b.选择不放
dp[i][j] = dp[i - 1][j] // 前i-1个物品在j容量下的dp
第二种情况取最大值即可
提交
function knapsack(weights, values, size) {
let goodsLength = weights.length
weights.unshift(0)
values.unshift(0)
// dp[i][j]代表前i个物品在容量j背包下的最大价值
let dp = []
for (let i = 0; i < goodsLength + 1; i++) {
for (let j = 0; j < size + 1; j++) {
if (j === 0) {
dp[i] = [] // 初始化二维数组
dp[i][j] = 0 // 容量为0,无法装物品,价值都是0
continue
}
if (i === 0) {
dp[i][j] = 0 // 前0个物品在任意容量下价值都是0
continue
}
if (weights[i] > j) {
dp[i][j] = dp[i - 1][j] // 第i个物品无法放下 => 前i-1个物品在j容量下的dp
} else {
let val1 = dp[i - 1][j - weights[i]] + values[i] // 放入了 => 前i-1个物品在j-weights[i]容量下的dp+values[i]
let val2 = dp[i - 1][j] // 可以选择不放入 => 前i-1个物品在j容量下的dp
dp[i][j] = val1 > val2 ? val1 : val2 // 取最大值
}
}
}
return dp[goodsLength][size]
}