XJY是一位勇敢的探险家,这一天他来到传说中的小谷围岛寻找宝藏。小谷围岛上有n个村庄和n-1条道路,且任意两个村庄可以相互到达。第i个村庄里有价值为Vi的大秘宝(取走之后就没有啦);对于第i条道路,XJY需要Ti天才能走完。现在XJY有m天的假期时间以供探险,他会从第k个村庄出发,最后回到第k个村庄。问XJY最多能取走价值多少的宝藏?
dp[i][j]表示第i个节点j天取到的最多宝藏。对i的每个孩子搜索天数:
dp[i][j]=max{ dp[i][j], dp[child][k]+dp[i][j-k-2*T] }, 0<=k<=j
注意:j要倒着算。不然后会出现计算重复的情况!
#include <cstdio>
#include <algorithm>
#include <cstring>
#define add(x,y,z) (to[++num]=H[x],H[x]=num,V[num]=y,T[num]=z)
#define For(x) for(int h=H[x],o=V[h],t=T[h]; h; h=to[h],o=V[h],t=T[h])
using namespace std;
int K,n,m,u,ans,v[100],dp[100][205];
int H[100],V[205],T[205],to[205],num;
void dfs(int x,int Fa){
dp[x][0]=v[x];
For(x) if (o!=Fa){ //往下,o 为 x 的子节点
dfs(o,x); //先处理处下面所有点的 dp 值
for (int j=m; j; j--) //从 x 出发回到 x 用 j 天
for