f[u][j] =max( f[y][k] +f[u][j-k]- w[i] )
#include <bits/stdc++.h>
using namespace std ;
const int N=3002,M=N*5,inf=0x7f7f3f;
int n,m,sz[N];
int a[N],nxt[M],go[M],hd[N],w[M],f[N][N],all;
void add(int x,int y,int z){
go[++all]=y; nxt[all]=hd[x],w[all]=z,hd[x]=all;
}
void init(int x){
if(x>n-m) {
sz[x]=1; return;
}
int i,y;
for(i=hd[x];i;i=nxt[i]){ y=go[i],init(y); sz[x]+=sz[y];}
}
void dfs(int x){
int i,j,y,k,s=0;
if(x>n-m) return;
for(i=hd[x];i;i=nxt[i]){
y=go[i]; dfs(y);
s+=sz[y];
for(j=s;j>0;j--)
for(k=1;k<=sz[y];k++)
if(j-k>=0) f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]-w[i]);
}
}
int main(){
int i,j,x,y,t;
cin>>n>>m;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) f[i][j]=-inf;
for(i=1;i<=n-m;i++){
cin>>t;
while(t--){
cin>>x>>y; add(i,x,y);
}
}
for(i=n-m+1;i<=n;i++) cin>>f[i][1];
for (i=1;i<=n;i++) f[i][0]=0;
init(1),dfs(1);
for(i=m;i>=1;i--){
if(f[1][i]>=0){ cout<<i<<'\n';break;}
}
}
浙公网安备 33010602011771号