分类

背包问题总结.png
dp[i][j]表示从下标0..i的物品中任意选择,当容量为j时得的价值为多少
公式一般为:

  1. dp[i][j] = max {
  2. dp[i - 1][j], /*不选当前元素*/
  3. dp[i][j - value] + value /*选择当前元素*/
  4. }
  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. dp数组初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

    遍历顺序

    01背包

    二维dp数组,物品和背包的遍历顺序不影响
    一维dp数组,只能先遍历物品再遍历背包,而且第二层循环从大往小遍历

    完全背包

  6. 如果求组合数就是外层for循环遍历物品,内层for遍历背包。

  7. 如果求排列数就是外层for遍历背包,内层for循环遍历物品。

    例子

  8. 能否装满背包 dp[i] = max(dp[i], dp[i - num] + num)

  9. 装满背包有几种方法 dp[i] = dp[i] + dp[i - num]
  10. 背包装满的最大值 dp[i] = max(dp[i], dp[i - value] + value)
  11. 装满背包所有物品的最小个数 dp[i] = min(dp[i - num] + 1, dp[i])