背包考前小结
背包问题
1、01背包:
一个物品取或不取,外层枚举第几个,内层枚举体积
注意降成一维时枚举体积要倒序。
2、完全背包
每种物品无限个。同上,只不过逆序改顺序(因为无限,则也要考虑当前层对答案的影响)
3、多重背包
可以看成01背包,只不过一种物品有多个,还是逆序循环体积,只不过多了层枚举个数。
可以二进制分解优化,从而转化为01背包。
4、混合以上三种背包
则多几个if语句,判断是哪种类型,分类讨论,代码同上
5、二维费用背包
只不过多了个状态而已,其他与上面一样。
有时候条件按隐含的方式给出:最多只能取M件物品,则可将每一件物品多加一维花费为1
6、分组背包
每组只能选一个,则可以看成01背包,要么这组选,要么不选。
循环还是逆序,只不过多了层组的循环,注意:逆序的V循环要在组的外面
7、有依赖性的背包
如果附件后无附件,只有一层主附关系,则可以对每个主件的附件分别进行01背包,最后再一起做01背包。
8、泛化物品
待填坑。。。
9、总结
灵活多变,多思考,多找性质,举一反三。
还有会求方案数的,可以多开一个数组记录一下。