luogu 2014 选课 树上背包

时间:2022-04-15 15:29:13

树上背包

#include<bits/stdc++.h>

using namespace std;

const int N=;
const int inf=0x3f3f3f3f;
vector<int> son[N];
int f[N][N],s[N],n,m; void dfs(int u){
f[u][]=;
for(int i=;i<son[u].size();i++){
int v=son[u][i];
dfs(v);
for(int j=m;j>;j--)
for(int k=j;k>=;k--)
if(j-k>=)
f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]);
}
if(u!=){
for(int i=m;i>;i--)
f[u][i]=f[u][i-]+s[u];
}
} int main(){
cin>>n>>m;
for(int i=;i<=n;i++){
int x;
cin>>x>>s[i];
son[x].push_back(i);
}
memset(f,-inf,sizeof f);
dfs();
printf("%d\n",f[][m]);
}