本文出自 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);
代码
/**=====================================================
* This is a solution for ACM/ICPC problem
*
* @source : zoj-3626 Treasure Hunt I
* @description : 树形dp
* @author : shuangde
* @blog : blog.csdn.net/shuangde800
* @email : zengshuangde@gmail.com
* Copyright (C) 2013/08/26 16:23 All rights reserved.
*======================================================*/
#include
#include
#include
#include
#include
#include
#include
#include
#include