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;}
 	}
 }
 

 
 

 

posted on 2023-03-06 14:01  towboat  阅读(17)  评论(0)    收藏  举报