Codeforces 106 C 多重背包

题目链接: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背包都可以做。。

贴代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #define INF 0x3f3f3f3f
 4 #define N 1005
 5 int f[N],s[N];
 6 struct bake
 7 {
 8     int val,we;
 9 } p[12*N];
10 int main()
11 {
12     int n,m,we,val,cnt=0;
13     scanf("%d%d%d%d",&n,&m,&we,&val);
14     int num = n/we;
15     for(int i=1; i<=num; ++i)
16         p[cnt].val = val,p[cnt].we = we,++cnt;
17     for(int i=0; i<m; ++i)
18     {
19         int a,b;
20         scanf("%d%d%d%d",&a,&b,&we,&val);
21         num = a/b;
22         for(int j=1; j<=num; ++j)
23             p[cnt].val = val,p[cnt].we = we,++cnt;
24     }
25     f[0] =0;
26     for(int i=0; i<cnt; ++i)
27         for(int j=n; j>=p[i].we; --j)
28             if(f[j-p[i].we] + p[i].val > f[j] )    f[j] = f[j-p[i].we] + p[i].val ;
29     printf("%d\n",f[n]);
30     return 0;
31 }
View Code

 

 

 

posted on 2013-08-19 20:43  allh123  阅读(288)  评论(0编辑  收藏  举报

导航