题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561
思路:dp[u][i]表示以u为根的树选了i个子节点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 222 int n,m;
int dp[MAXN][MAXN];
int val[MAXN];
vector<vector<int> >G; void dfs(int u,int father)
{
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==father)continue;
dfs(v,u);
for(int j=m;j>=;j--){
for(int k=;k<=j;k++){
dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
}
}
if(u!=){
for(int j=m;j>=;j--){
dp[u][j]=dp[u][j-]+val[u];
}
}
} int main()
{
int u,w;
while(~scanf("%d%d",&n,&m)){
if(n==&&m==)break;
G.clear();
G.resize(n+);
for(int i=;i<=n;i++){
scanf("%d%d",&u,&w);
G[u].push_back(i);
val[i]=w;
}
memset(dp,,sizeof(dp));
dfs(,-);
printf("%d\n",dp[][m]);
}
return ;
}