本文出自 http://blog.csdn.net/shuangde800
题目链接: zoj-3626
题意
给一棵n个节点的树, 节点编号1~n, 每个节点有权值val[i],经过这个节点就可以获取这个价值(不能重复获得)
每一条边有一个花费值w(i,j), 表示走完i和j点的边要花费w(i,j)
现在要从k点出发,总花费值为m,问总花费不超过m的情况下并且最终要回到出发点,最多可以获取多少价值?
思路
简单树形dp。
f(i,j)表示子树i, 用花费j最多可以获得的价值
对与i的每个儿子,可以选择分配花费2*w, 2*w+1, 2*w+2,...j给它,可以看作是一组物品
对所有儿子做分组背包
f(i, j) = max{ max{ f(i, j-k) + f(v, k-2*w) | 2*w<=k<=i } | v是i的儿子节点}
ans = f(k, m);