通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接。但是每个房间里都有特别的保护魔法,在它的作用下,我无法通过这个房间,也无法取得其中的钥匙。虽然我可以通过消耗能量来破坏房间里的魔法,但是我的能量是有限的。那么,如果我最先站在1号房间(1号房间的保护魔法依然是有效的,也就是,如果不耗费能量,我无法通过1号房间,也无法取得房间中的钥匙),如果我拥有的能量为P,我最多能取得多少钥匙?
#include<bits/stdc++.h>
using namespace std;
int n,p;
struct node{
int l,r;
}a[105];
int rt;
int w[105],c[105];//钥匙数 消耗
int dp[105][105];
//int sn[105],sc[105];//子树钥匙总数 子树消耗总数
void dfs(int x,int y){
if(dp[x][y]) return ;
// if(a[x].l) dfs(a[x].l);
// if(a[x].r) dfs(a[x].r);
for(int k=0;k<=y-c[x];k++){
//做法一
if(a[x].l) dfs(a[x].l,k);
if(a[x].r){
dfs(a[x].r,y-k-c[x]);
dfs(a[x].r,y);
}
dp[x][y]=max(dp[x][y],max(dp[a[x].l][k]+dp[a[x].r][y-k-c[x]]+w[x],dp[a[x].r][y]));
//做法二
// dp[x][k]=dp[a[x].r][k];
// for(int i=0;i<=k-c[x];i++){
// dp[x][k]=max(dp[x][k],dp[a[x].l][i]+dp[a[x].r][k-i-c[x]]+w[x]);
// }
}
/*
//for(int k=1;k<=m+1&&k<=sn[x];k++){//枚举子树名额
// dp[x][k]=dp[a[x].r][k];//跟兄弟顺承
// for(int i=max(1,k-sn[a[x].r]);i<=k&&i<=sn[a[x].l]+1;i++){
// dp[x][k]=max(dp[x][k],dp[a[x].l][i-1]+dp[a[x].r][k-i]+w[x]);//找最大
// }
//}
*/
}
void add(int x,int y){
a[y].r=a[x].l;
a[x].l=y;
}
//bool prt[105];
int main(){
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++){
scanf("%d%d",&c[i],&w[i]);
}
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
//prt[y]=true;
}
dfs(1,p);
printf("%d",dp[1][p]);
return 0;
}////多叉树 消耗cx单位获得kx价值 出始在p 求最大价值
//dp[i][j]表示在 使用j单位在i的最大价值
//dp[i][j]=max(dp[a[x].l][k]+dp[a[x].r][q-k-c[x]]+w[x]) //枚举q,k q为现有能量 k为分配给左子树使用能量
一直WA,20分