/**
* 例子:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。
* 每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
*
* dp[i][j]含义:表示从下标为[0-i]的物品里任意取,放进最大容量为j的背包,价值总和的最大值。
*/
let weights = [1,3,4], values= [15,20,30], packageWeight = 4
function findMaxContent (weights, values, packageWeight) {
const len = weights.length
let dp = Array(len).fill(0).map(_ => Array(len).fill(0))
for(let j=weights[0]; j<=packageWeight; j++) {
dp[0][j] = values[0]
}
for(let i=1; i<weights.length; i++) {
for(let j=0; j<=packageWeight; j++) {
// 1、放不下物品i的话,最大值就是dp[i-1][j]
if(weights[i] > j) dp[i][j] = dp[i-1][j]
// 2、能放不下物品i的话,自己画出dp推导就知道了 不好表述
else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weights[i]] + values[i])
}
}
console.log(dp)
return dp[len-1][packageWeight]
}
findMaxContent(weights, values, packageWeight)
console