背包问题是经典的动态规划,分为0-1背包、完全背包和多重背包,0-1背包就是选或者不选,完全背包就是物品的数量是无限个,选择几个的问题。多重背包就是每一件物品的数量不同如何选择的问题。
主要掌握01和完全即可
01 背包
适用于
- 典型的01背包问题,n个物品,他们都有自己的质量和价值,有一个背包容积是V,问能拿取的物品的最大价值是多少 ACW_E2
- 从一个序列中取若干个值,使得这些值的和最接近target,问这个最接近的值是多少 M1049
- 从一个序列中取若干个值,使得这些值的和为target,问有多少种挑选的方法 M494
- 从一组物品中挑选若干个,物品既有体积也有重量,这并不是多重背包,而是物品的重量有了两个维度 M474
完全背包
与01背包唯一的区别就是物品的个数是无限的
- 典型的完全背包问题,ACW_E3
dp[j]=max(dp[j],dp[j-vs[i]]+ws[i])
- 从一个数组中挑选若干个数组合成新的数,且每一个数都不限制个数,M518
dp[j] += dp[j-coins[i]]
- 从一个数组中挑选若干个数组合成新的数,且每一个数都不限制个数,至少多少个数可以组合成目标数 M322
dp[j]=min(dp[j],dp[j-coins[i]]+1)
- 从一个数组中挑选若干个数组合成新的数,且每一个数都不限制个数,但是问排列类型有多少,M377
先容量再物品 dp[j]+=dp[j-nums[i]]