0,1背包最大价值问题

99 阅读1分钟
  1. 定义状态

    • 使用一个二维数组 dp[i][j],其中 i 表示前 i 个物品,j 表示当前背包的容量。dp[i][j] 表示在前 i 个物品中选择物品放入容量为 j 的背包中所能获得的最大价值。
  2. 状态转移方程

    • 对于每个物品 i,我们有两种选择:

      • 不放入背包:此时 dp[i][j] = dp[i-1][j],即不选择当前物品,背包的价值与前 i-1 个物品相同。
      • 放入背包:如果当前背包容量 j 大于等于物品 i 的重量 weights[i-1],则可以选择放入物品 i,此时 dp[i][j] = dp[i-1][j - weights[i-1]] + values[i-1],即选择当前物品,背包的价值为前 i-1 个物品在容量为 j - weights[i-1] 时的最大价值加上当前物品的价值。
    • 最终的状态转移方程为:

      plaintext

      dp[i][j] = max(dp[i-1][j], dp[i-1][j - weights[i-1]] + values[i-1])

  3. 初始化

    • dp[0][j] 表示没有物品可选时,背包的最大价值为0。
    • dp[i][0] 表示背包容量为0时,最大价值为0。
  4. 最终结果

    • 最终答案为 dp[n][m],即在前 n 个物品中选择物品放入容量为 m 的背包中所能获得的最大价值。