您的位置:首页 > 其它

HLG 1377 金明的预算方案[有依赖的背包]

2012-05-02 20:17 429 查看
题意: 有 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: