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 }