#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 305
using namespace std;
int n,m,Fa[maxn],Son[maxn][maxn],Cnt[maxn],Sc[maxn],f[maxn][maxn];
void dfs(int now,int Muc){
for(int i=0;i<Cnt[now];i++){
int tmp=Son[now][i];
for(int j=0;j<Muc;j++)
f[tmp][j]=f[now][j]+Sc[tmp];
dfs(tmp,Muc-1);
for(int j=1;j<=Muc;j++)
f[now][j]=max(f[now][j],f[tmp][j-1]);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&Fa[i],&Sc[i]);
Son[Fa[i]][Cnt[Fa[i]]++]=i;
}
dfs(0,m);
printf("%d",f[0][m]);
}
树上背包写法(选课)
最新推荐文章于 2022-10-27 22:10:01 发布