树形依赖背包是指所有物品形成了相互依赖关系(即选了A就必须选B)的背包问题.一般这种依赖关系都是树形的(如果不是就只能用网络流搜索),所以这种背包问题也叫树形背包问题.
树形背包可以套用最大权闭合图的算法搜索来做,但是这种算法的复杂度过高,徐持衡大牛在他2009年的论文中提出了一种O(NV)的算法,可以有效地解决这类问题.这篇文章可以看做该论文的简化版,建议想要更加深入了解的同学去看一下徐持衡的论文.
先看一道题目(直接贴图片):
选课
其中,m<=1000,n<=m;
[解决]这是一道典型的树形背包,我们先将多叉树转成二叉树,再进行DP.
一般的背包是要令f[I,j]表示前i个物品选取体积共为k的物品所能得到的最大价值.然而这样进行dp,时间复杂度最低也是O(NC*C)的,因为合并两个泛化物品的最低复杂度是O(c)的.
那么,我们应该怎样进行DP呢?
注意到树形背包与普通背包最大的不同就在于它具有依赖性,只要消去这种这种依赖性,那么我们就能像普通背包那样O(NC)地求解了.
怎样消除这种依赖性呢?
由于树结构的特征,所有节点都只有一个前驱,所以,我们可以在对一个物品进行DP时,强制把他的前驱加进背包!
&nb