HLG 1377 金明的预算方案[有依赖的背包]
题意: 有 n 个物品,有主件附件之分,买附件必须先买主件,问最后可以得到的价值最大是多少?
分析: 分组背包的变形。
View Code
#include<stdio.h> #include<string.h> #define max(a,b)(a)>(b)?(a):(b) int w[100]; struct node { int to,next; }q[100]; int head[61]; int num[61]; int tot; void add(int s,int u) { q[tot].to=u; q[tot].next=head[s]; head[s]=tot++; } int main() { int f[32002]; int a[500],b[500]; int c[500]; int top,i,j,k,fu,n,z,v,x,y,wi,a_tmp,b_tmp; while(scanf("%d%d",&v,&n)!=EOF) { memset(head,0,sizeof(head)); memset(num,0,sizeof(num)); tot=1; for(i=1;i<=n;i++) { scanf("%d%d%d",&wi,&x,&y); num[y]++; c[i]=wi; w[i]=wi*x; add(y,i); } for(i=0;i<=v;i++) f[i]=0; for(i=head[0];i;i=q[i].next) { top=0; k=q[i].to; a[top]=w[k]; b[top++]=c[k]; a_tmp=b_tmp=0; for(j=head[k];j;j=q[j].next) { fu=q[j].to; a[top]=w[k]+w[fu]; b[top++]=c[k]+c[fu]; a_tmp+=w[fu]; b_tmp+=c[fu]; } if(num[k]==2) { a[top]=w[k]+a_tmp; b[top++]=c[k]+b_tmp; } for(j=v;j>=0;j--) for(z=0;z<top;z++) if(j>=b[z]) f[j]=f[j]>f[j-b[z]]+a[z]?f[j]:f[j-b[z]]+a[z]; } printf("%d\n",f[v]); } return 0; }