Yuhang's Blog

重学背包

2021-01-17 CodingMathematics

  1. 1. 0/1背包
  2. 2. 完全背包
  3. 3. 树上背包

背包的数学记法。

0/1背包

给定正整数nV1,V2,VnW1,W2,Wn。对于任意自然数m,定义集合族S(m)S(m):={MiMVi=m} 则0/1背包问题是对给定的m,求 f(m):=maxMS(m)iMWi 递推求解。记Sk(m)fk(m)是上述两个定义对前kViWi考虑后得到的结果。现在考虑从k1的情形递推到k的情形,即将VkWk新加入考虑。考虑Sk(m)是如何构成的:

  1. 那些没有选择k的集合,就是Sk1(m)。即

{MMSk(m) and kM}=Sk1(m)

  1. 那些选择了k的集合,就是Sk1(mVk){k}。即

{MMSk(m) and kM}=Sk1(mVk){k} 由此可见,Sk1(m)Sk1(mVk)kSk(m)的一个划分。从而, fk(m)=max(maxMSk1(m)iMWi,maxMSk1(mVk)kiMWi) fk(m)=max(fk1(m),fk1(mVk)+Wk) 初始值满足,S0(0)=,从而 f0(0)=0 其他值应当设为负无穷。 考虑实现。由于在k的维度上,fk(m)只依赖fk1(m)(其中mm),因此采取一维数组倒序循环即可。

完全背包

将0/1背包中的集合族S(m)改为多重集合族即为完全背包。其结果为 fk(m)=max(fk1(m),fk(mVk)+Wk) 实现中将倒序循环改为正序循环即可。

树上背包

给定一棵有根数,每个点有点权Wi,选择一个点必须先选择它的父亲。一共选择m个节点,要求最大化点权和。 设f(u,m)是以u为根的子树选择m个节点时最大的点权和。选择的依赖关系,等价于以u为根的子树选择1个节点时必须选择u,即f(u,1)=Wu。 下面逐个考虑u的儿子v。注意此时v可以看作是背包中选择的物体,但这个物体的体积和价值均可随着其贡献的节点数变化。在利用v更新u的答案的时候,除了倒序遍历m,还需要遍历v的所有可能的体积和价值,即枚举v的所有可能的贡献的节点数。