题目

给定一组物品,每个物品有重量 w[i] 和价值 v[i],以及一个容量为 C 的背包。如何选择装入背包的物品,使得背包中物品的总价值最大,且总重量不超过背包容量?

实现

思路:每个物品要么装入,要么不装 注意:总重量不能超过限制 dp 定义:dp[i][j] 表示前 i 个物品在背包容量为 j 时的最大价值 状态转移方程:

dp[i][j] = max(
    dp[i-1][j],                   # 不选第i个物品
    dp[i-1][j-w[i]] + v[i]        # 选第i个物品(需j≥w[i])
)

初始化:

  • dp[0][j] = 0(前 0 个物品价值为 0)
  • dp[i][0] = 0(容量为 0 时价值为 0)

复杂度分析

  • 时间复杂度:
  • 空间复杂度:
/**
 * @param {string} s
 * @return {string}
 */
function knapsack(weights, values, C) {
    const dp = new Array(C + 1).fill(0);
    
    for (let i = 0; i < weights.length; i++) {
        for (let j = C; j >= weights[i]; j--) {
            dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
        }
    }
    return dp[C];
}