1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<bits/stdc++.h> using namespace std; int n,m,fir[3010],nxt[3010],w[3010],son[3010],tot,v[3010],f[3010][3010]; inline void add(int x,int y,int z){++tot;nxt[tot]=fir[x];fir[x]=tot;son[tot]=y;w[tot]=z;} inline int DFS(int x){ if(n-m+1<=x&&x<=n){ f[x][1]=v[x]; return 1; } int sum=0; for(int tmp,to,i=fir[x];i;i=nxt[i]){ to=son[i]; tmp=DFS(to); sum+=tmp; for(int j=sum;j;j--){ for(int k=1;k<=tmp;k++){ if(j-k>=0) f[x][j]=max(f[x][j],f[x][j-k]+f[to][k]-w[i]); } } } return sum; } int main(){ scanf("%d%d",&n,&m); for(int x,y,z,i=1;i<=n-m;i++){ scanf("%d",&x); for(;x;x--) scanf("%d%d",&y,&z),add(i,y,z); } for(int i=n-m+1;i<=n;i++) scanf("%d",&v[i]); memset(f,-63,sizeof(f)); for(int i=1;i<=n;i++) f[i][0]=0; DFS(1); for(int i=m;i>=1;i--){ if(f[1][i]>=0){printf("%d ",i);break;} } return 0; }
|