这份代码没有过样例,原因是没有初始化siz[0],但是AC了
#include <bits/stdc++.h>
using namespace std;
int n,m,s[305],k[305],d[305],sta[305],sp,f[305][305],siz[305],ans;
int main(){
scanf("%d%d",&n,&m);
m++;
for(int i=1;i<=n;i++) scanf("%d%d",&k[i],&s[i]),d[k[i]]++,f[i][1]=s[i],siz[i]=1;
for(int i=1;i<=n;i++) if(!d[i]) sta[sp++]=i;
while(sp){
int ls=sta[--sp];
if(ls==0) break;
siz[k[ls]]+=siz[ls];
for(int i=min(m,siz[k[ls]]);i>=1;i--)
for(int j=min(m,min(siz[ls],i-1));j>=1;j--){
f[k[ls]][i]=max(f[k[ls]][i],f[k[ls]][i-j]+f[ls][j]);
}
d[k[ls]]-=1;
if(!d[k[ls]]) sta[sp++]=k[ls];
}
for(int i=1;i<=m;i++) ans=max(ans,f[0][i]);
printf("%d\n",ans);
return 0;
}