http://acm.hdu.edu.cn/showproblem.php?pid=1561
此题与选课一题一样,讲解看
http://blog.csdn.net/Darost/article/details/52555114
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ms(i,j) memset(i, j, sizeof(i));
using namespace std;
int n,m;
int c[205];
vector<int> G[205];
int f[205][205];
int t;
void dfs(int u)
{
for (int i=1;i<=m;i++)
f[u][i] = c[u];
for (int i=0;i<G[u].size();i++)
{
int v = G[u][i];
dfs(v);
for (int j=t;j>=2;j--)
for (int k=1;k<j;k++)
f[u][j] = max(f[u][j], f[u][j-k]+f[v][k]);
}
}
int main()
{
while (scanf("%d%d", &n, &m)==2&&(n||m))
{
for (int i=0;i<=n;i++) G[i].clear();
ms(f,0);
for (int i=1;i<=n;i++)
{
int ai;
scanf("%d%d", &ai, &c[i]);
G[ai].push_back(i);
}
t = m+1;
dfs(0);
printf("%d\n", f[0][m+1]);
}
return 0;
}