背包问题

87 阅读1分钟
  • 01背包:n种物品,每种物品只有1个
  • 完全背包:n种物品,每种物品无限个
  • 多重背包:n种物品,每种物品个数各不相同

01背包

dp数组

  • 二维数组dp[i][j]:[0-i]之间的物品任取放进容量为j的背包里最大价值
  • 一维数组dp[j] : 容量为j的背包所背的最大价值

递推公式

  • 不放物品i:dp[i-1][j]

  • 放的物品i:dp[i-1][j-weight[i]]+val[i]

  • dp[i][j] = max(,)

  • 一维滚动数组,相当于把上一层copy下来了

  • dp[j] = max(dp[j],dp[j-weight[i]]+val[i])

初始化

遍历顺序

(一维)01背包

  • 组合数先遍历物品,在遍历背包(倒叙,保证物品添加一次)

(二维)

  • 正序倒序都行

完全背包

  • 顺序:背包正序

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

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