您的位置:首页 > 其它

Codeforces 106 C 多重背包

2013-08-19 20:43 387 查看
题目链接:http://codeforces.com/problemset/problem/106/C

根据题意列出式子,设每种蛋糕做了xi个,则对于每种材料bi*xi<=ai。

对于dough,有sum(ci*xi) + c0*x0 <=n.

要使得sum(di*xi)+d0*x0最大,立即转化为多重背包,有xi<=ai/bi.这是物品i的数量限制,背包的容量为n,每件物品的体积为ci,价值为di。由于数据比较弱,就算直接拆分成0-1背包都可以做。。

贴代码:

#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
#define N 1005
int f
,s
;
struct bake
{
int val,we;
} p[12*N];
int main()
{
int n,m,we,val,cnt=0;
scanf("%d%d%d%d",&n,&m,&we,&val);
int num = n/we;
for(int i=1; i<=num; ++i)
p[cnt].val = val,p[cnt].we = we,++cnt;
for(int i=0; i<m; ++i)
{
int a,b;
scanf("%d%d%d%d",&a,&b,&we,&val);
num = a/b;
for(int j=1; j<=num; ++j)
p[cnt].val = val,p[cnt].we = we,++cnt;
}
f[0] =0;
for(int i=0; i<cnt; ++i)
for(int j=n; j>=p[i].we; --j)
if(f[j-p[i].we] + p[i].val > f[j] )    f[j] = f[j-p[i].we] + p[i].val ;
printf("%d\n",f
);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: