标签:
最近两天为树形背包问题所困扰。 这一切的起因是一年前在hackerrank上做的一道题 A Knapsack Problem。
题目大意是:
$给一棵N个节点的树,节点i代表一件价值为v[i],体积为s[i]的物品。另有一个体积为M的背包,要求在树上选一个连通块装进背包,\\使得所选物品的总价值最大。$
数据范围:
$N, M\le2000$
朴素的做法复杂度是$O(NM^2)$,TLE。一直没看editorial,拖到现在。做这题之前我已看过崔添翼的《背包九讲,期间又读了2009年国家集训队徐持衡的论文《浅谈几类背包问题》,徐的论文中提到树形依赖背包问题有O(NM)解法,我很高兴,然而看了以后并不能懂。最近又想起这道题,再去翻徐的论文,折腾了两天,才发现:
徐论文中所谓的树形依赖背包问题指的是:
$给一棵N个节点的有根树,树的每个节点代表一件价值为v[i],体积为s[i]的物品。另有一个体积为M的背包,要求在树上选一个包含根节点的连通块装进背包,\\使得所选物品的总价值最大。$
然而明确了这一点以后,我一时还是搞不懂徐持衡对此问题给出的$O(NM)$的树形DP解法。又花了些功夫才基本弄懂:
$dp[i][j]表示选择了节点i及其所有祖先节点(即根节点到i的路径\text{---}记做P_i\text{---} 上的所有节点),\\此外再在P_i的左侧和子树i中选择总体积不超过j的物品的最大价值。$
标签:
原文地址:http://www.cnblogs.com/Patt/p/5642181.html