背包的数学记法。
0/1背包
给定正整数、、。对于任意自然数,定义集合族为 则0/1背包问题是对给定的,求 递推求解。记和是上述两个定义对前个和考虑后得到的结果。现在考虑从的情形递推到的情形,即将和新加入考虑。考虑是如何构成的:
- 那些没有选择的集合,就是。即
- 那些选择了的集合,就是。即
由此可见,和是的一个划分。从而, 初始值满足,,从而 其他值应当设为负无穷。 考虑实现。由于在的维度上,只依赖(其中),因此采取一维数组倒序循环即可。
完全背包
将0/1背包中的集合族改为多重集合族即为完全背包。其结果为 实现中将倒序循环改为正序循环即可。
树上背包
给定一棵有根数,每个点有点权,选择一个点必须先选择它的父亲。一共选择个节点,要求最大化点权和。 设是以为根的子树选择个节点时最大的点权和。选择的依赖关系,等价于以为根的子树选择个节点时必须选择,即。 下面逐个考虑的儿子。注意此时可以看作是背包中选择的物体,但这个物体的体积和价值均可随着其贡献的节点数变化。在利用更新的答案的时候,除了倒序遍历,还需要遍历的所有可能的体积和价值,即枚举的所有可能的贡献的节点数。