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背包都可以做。。
贴代码:
View Code
根据题意列出式子,设每种蛋糕做了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
相关文章推荐
- Codeforces 106 C Buns【多重背包】
- Codeforces 106 C Buns【多重背包】
- CodeForces-366C Dima and Salad 对01背包的理解 多个背包问题
- NYOJ 106 背包问题 【贪心算法】
- 南阳理工ACM——106背包问题
- 106 背包问题
- Codeforces--106C--Buns(背包)
- NYOJ106背包问题
- CodeForces 366C 动态规划 转化背包思想
- nyoj 106 背包问题
- Codeforces 106 D. Treasure Island(前缀和预处理)
- 【Codeforces 283 C. Coin Troubles】+ 拓扑序 + 完全背包
- NYOJ-106 背包问题
- NYOJ 106 背包问题 贪心算法
- 106-背包问题
- CodeForces - 946D Timetable(分组背包)
- 【ACM】nyoj_106_背包问题_201308152026
- Codeforces 687C The Values You Can Make(背包)
- 南阳理工ACM——106背包问题
- Codeforces--106C--Buns(背包)