思路:令dp[i][j]为走到以i为根节点,打了j个宝物的最大值,那么有dp[i][j]=max(dp[i][j],dp[i][k]+dp[v][j-k])
#include<bits\stdc++.h>
using namespace std;
vector<int>e[250];
int dp[250][250];
int n,m;
void dfs(int u,int fa)
{
for(int i = 0;i<e[u].size();i++)
{
int v = e[u][i];
if(v==fa)
continue;
dfs(v,u);
for(int j = m;j>1;j--)
for(int k = 1;k<j;k++)
dp[u][j]=max(dp[u][j],dp[u][k]+dp[v][j-k]);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF && (n+m))
{
m++;
for(int i = 0;i<=n;i++)
e[i].clear();
memset(dp,-1,sizeof(dp));
dp[0][1]=0;
for(int i= 1;i<=n;i++)
{
int u,cost;
scanf("%d%d",&u,&cost);
e[i].push_back(u);
e[u].push_back(i);
dp[i][1]=cost;
}
for(int i = 0;i<=n;i++)
{
dp[i][0]=0;
}
dfs(0,-1);
printf("%d\n",dp[0][m]);
}
}