51Nod 1086背包问题V2
2016-01-29 22:52
302 查看
题目:
有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。
Input
Output
Input示例
Output示例
多重背包问题:
题目:
有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。
Input
第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000) 第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)
Output
输出可以容纳的最大价值。
Input示例
3 6 2 2 5 3 3 8 1 4 1
Output示例
9
多重背包问题:
<span style="font-size:24px;">#include"stdio.h" #include"stdlib.h" #include"string.h" #include"algorithm" #include"ctype.h" const int maxn=102;//物品数量 const int maxv=50000+2; //背包容量 int c[maxn],w[maxn],num[maxn]; int n,V; int F[maxv]; int max(int a,int b) { return a>b?a:b; } void print() { for(int i=1;i<=V;i++) printf("%d ",F[i]); printf("\n"); } void ZeroOnePack(int c,int w) //重量、价值 {//01背包考虑第i件物品 for(int i=V;i>=c;i--) F[i]=max(F[i],F[i-c]+w); } void CompletePack(int c,int w) {//完全背包 for(int i=c;i<=V;i++) F[i]=max(F[i],F[i-c]+w); } void MultiplePack(int c,int w,int m) { //多重背包 if(c*m>=V) { CompletePack(c,w); // print(); } else { int k=1; while(k<m) { ZeroOnePack(k*c,k*w); m-=k; //记录剩下的 k=k*2; // print(); } ZeroOnePack(m*c,m*w); //print(); } } int main() { scanf("%d%d",&n,&V); for(int i=1;i<=n;i++) scanf("%d%d%d",&c[i],&w[i],&num[i]); for(int i=1;i<=n;i++) MultiplePack(c[i],w[i],num[i]); //O(Vlogm) printf("%d\n",F[V]); return 0; }</span>
相关文章推荐
- C语言学习笔记 位运算
- POJ 2393 Yogurt factory
- 2015-01-29
- 《c++primer笔记》复合类型--引用
- springmvc配合jsp/ajax/json,实现简单的jsp遍历后台数据
- 一些iOS常用的第三方库和控件
- Android Studio快捷键(MAC版)
- iSensor APP 之 摄像头调试 MT9D001 MT9P031 测试小结 200万像素和500万像素摄像头
- 项目中Gradle使用总结
- 【Linxu学习005】用户管理
- TCP/IP协议之单播, 多播, 广播
- mysql数据备份及恢复
- 8. Checker
- CentOS下更改网络接口名
- Android之Bitmap 高效加载
- vb.net+SQL Server读写图片
- 转 15款免费WiFi(入侵破解)安全测试工具
- tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面
- JAVA移位运算符
- 堆与栈的区别