2021.8.24
背包问题讨论的是容量、价值、物品相关问题。
- 根据物品不同形式分为0~1背包(每个物品只有一个)
- 完全背包(每个物品有无限多个)
- 多重背包(每个物品有不同的个数)。
完全背包问题,大致分为三类: 第一类为找组合;第二类为找排列;第三类为找组合最小值。
背包问题遍历方式有背包在外、物品在内和背包在内、物品在外两种。
-
对于除排列组合以外的问题,两种遍历方式都行,只不过背包在外、物品在内时,要考虑背包容量是否能装的下物品,因此要做一个if判断
-
对于完全背包组合问题,物品在外,背包在内;对于完全背包排列问题,背包在外,物品在内。排列组合问题地推公式都为 dp[j] += dp[j - nums[i]]. 对于完全背包组合问题最小值,两种遍历方式都行,递推公式为: dp[j] = min(dp[j], dp[j - nums[i]] + 1).
-
背包问题求最小值,初始化为最大值 dp(n + 1, INT_MAX). 为了不溢出,因此在判断的时候还要加上条件.