https://www.luogu.org/problemnew/show/P2014
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
const int MAXN=505;
int n,m,ff,f[MAXN][MAXN];
struct cyq
{
int s,cnt;
int q[MAXN];
}a[MAXN];
void dfs(int x){
//f[x][0]=0;f[x][1]=a[x].s;
for(int i=1;i<=a[x].cnt;i++){
int k=a[x].q[i];dfs(k);
for(int u=m;u>0;u--)
for(int v=u;v>0;v--)
f[x][u]=max(f[x][u],f[x][u-v]+f[k][v]);
}
if(x)
for(int t=m;t>0;t--) f[x][t]=f[x][t-1]+a[x].s;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&ff,&a[i].s);
a[ff].q[++a[ff].cnt]=i;
}
dfs(0); printf("%d\n",f[0][m]);
return 0;
}