背包九讲笔记


初始化问题

 当所求为恰好填满背包时;初始化状态除了j=0以外的值都为inf;原因在;此时的fi,j表示的是恰好填满背包的最大值;而初始除了j=0以外的背包都没有填满;故其他状态赋值inf.

而所求最大能填多少时,初始状态都赋值为0(原因同理).

①01背包

空间优化:因为每次fi,j的状态都由与fi-1有关的项表示所以可以优化到一位数组上求解此问题,

而此时需要注意的是j应该倒着枚举;因为正着枚举的前项改变变成了实际上的fi,j而我们想要的是fi-1,j即正向枚举会影响状态转移.

普通01背包做法 需要注意0~c[i]时的状态转移即为fi,j=fi-1,j不然会寄.

②完全背包

铸币思路:直接01背包的处理方式,对每一件物品,设其有能把背包填满项,vector维护一下,直接当成01背包做.

优化:由于一件物品可以无限次的选,那么可以考虑转移方程为:fi,j=max(fi-1,j,fi,j-c[i]+w[i])故考虑01背包时我们的优化处理,即我们通过逆序枚举来使得转移方程的右项为此轮枚举i未改变的值;那么我 们只要顺序枚举就能让右项变成此轮枚举过的i

③多重背包

二进制优化:将每件物品的个数pi表示成二进制可得其最高位的数;那么可以将其进行拆分为 1,2,4,8,...,2k-1,p-2k+1.

可以发现通过上面的拆分的任意组合,可以且仅可以拼凑出0-p之间的任意自然数.而后即可转换为01背包处理.复杂度为O(V∑logpi)

优先队列优化:

前置知识:单调队列 参考题目:滑动窗口

blog.csdn.net/flyinghearts/article/details/5898183太懒了看巨巨写的吧

代码可以参考洛谷题目 宝物筛选 的题解

④混合背包

⑤分组背包

⑥二维费用背包

⑦有依赖的背包

其实都是上述三种分析问题的变式应用,理解前三种也就没啥好说的了...

⑧泛化物品

没看懂,有题目看懂了更

相关