#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
vector<int>que[210];
int dp[210][210]; //dp[i][j] 表示从以i为根的树中选取j个取得的最大利益。
int value[210];
int n, m;
void dfs(int x) {
dp[x][1] = value[x]; //以x为根时自己是必选的。
for(int i = 0; i <(int)que[x].size(); i++){
int to = que[x][i];
dfs(to);
for(int i = m; i >= 1; i--)
for(int j = 1; j < i; j++)
dp[x][i] = max(dp[x][i], dp[x][i-j] + dp[to][j]);
}
}
int main()
{
int a, b;
while(scanf("%d%d", &n, &m)!= EOF) {
if(n == 0 && m == 0)
break;
for(int i = 0; i <= n; i++)
que[i].clear();
for(int i = 1; i <= n; i++) {
scanf("%d%d", &a, &b);
value[i] = b;
que[a].push_back(i);
}
memset(dp,0, sizeof(dp));
value[0] = 0;
m++;
dfs(0);
printf("%d\n", dp[0][m]);
}
return 0;
}
hdu1561树形背包
最新推荐文章于 2022-07-30 10:19:33 发布