背包问题的本质: 有限制的选择问题;
-
01背包问题: O(N V)
f[i][j], 对第i个物品的选择做划分(选或不选);滚动数组优化: 少一维, 体积从后往前遍历; O(N V)
-
完全背包问题: O(N V^2)
f[i][j], 对第i个物品的选择做划分(不选或者选几个);优化: 先用公式推导+迭代; O(N V)
再用滚动数组优化, 体积从前往后遍历; -
多重背包问题: O(N V S)
f[i][j], 对第i个物品的选择做划分(不选或者选几个, 多了数量的限制)优化:
1. 二进制优化: 将多重背包转换成01背包, 再用01背包的方法解题; O(N V logS)
2. 单调队列优化: (略) -
分组背包问题:
f[i][j], 对第i组的物品的选择做划分(根据组内的选取要求对组内物品做划分)根据题目要求, 对组内的操作转换成为我们熟悉的操作;
依次对各个组做操作, 就是分组背包要求;
例如每组内的选择情况满足01背包要求, 则使用01背包要求规范解答; -
混合背包问题:
是01, 完全, 多重的组合;
遇到哪种情况的背包问题, 就用那种情况的方式来求解;