码迷,mamicode.com
首页 > 其他好文 > 详细

树形背包总结

时间:2016-07-05 06:22:43      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:

最近两天为树形背包问题所困扰。 这一切的起因是一年前在hackerrank上做的一道题 A Knapsack Problem

题目大意是:

$给一棵N个节点的树,节点i代表一件价值为v[i],体积为s[i]的物品。另有一个体积为M的背包,要求在树上选一个连通块装进背包,\\使得所选物品的总价值最大。$

数据范围:

$N, M\le2000$

朴素的做法复杂度是$O(NM^2)$,TLE。一直没看editorial,拖到现在。做这题之前我已看过崔添翼的《背包九讲,期间又读了2009年国家集训队徐持衡的论文《浅谈几类背包问题》,徐的论文中提到树形依赖背包问题有O(NM)解法,我很高兴,然而看了以后并不能懂。最近又想起这道题,再去翻徐的论文,折腾了两天,才发现:

  • 徐的论文讲的比较简略,确实有点难懂
  • 徐所讨论的树形依赖背包问题和A Knapsack Problem根本不是同一个问题

徐论文中所谓的树形依赖背包问题指的是:

$给一棵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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!