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;
}
posted @ 2012-05-02 20:17  'wind  阅读(320)  评论(0编辑  收藏  举报