51nod 1086 背包问题 V2 多重背包
2016-05-20 23:32
302 查看
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086
题意:有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。
标准的多重背包
题意:有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。
标准的多重背包
#include <iostream> #include<bits/stdc++.h> using namespace std; int d[55000],n,m; void zeroonepack(int w,int p) { for(int i=m;i>=w;i--) if(d[i]<d[i-w]+p) d[i]=d[i-w]+p; } void completepack(int w,int p) { for(int i=w;i<=m;i++) if(d[i]<d[i-w]+p) d[i]=d[i-w]+p; } void multipack(int w,int p,int c) { if(w*c>=m) completepack(w,p); else { int k=1; while(k<c) { zeroonepack(k*w,k*p); c-=k; k*=2; } zeroonepack(c*w,c*p); } } int main() { while(~scanf("%d%d",&n,&m)) { memset(d,0,sizeof(d)); for(int i=0;i<n;i++) { int w,p,c; scanf("%d%d%d",&w,&p,&c); multipack(w,p,c); } cout<<d[m]<<endl; } }
相关文章推荐
- android 中怎么控制EditText只能输入数字和字母?
- grass buffer2 算法
- USB键盘数据格式以及按键键值
- Missing iOS Distribution signing identity问题解决
- Linux常用命令
- yii2-gii的详细操作步骤
- Linux文件编辑命令详细整理
- mac下mysql5.7修改字符编码为utf-8(或许通用)
- How to Upgrade Node.js via NPM
- Android-->如何填MediaRecorder的坑(附TextureView的使用)
- [原创]Scala学习:编写Scala脚本
- py2exe 的使用
- 2.css选择器
- hibernate+spring中,sql查询的映射问题备忘录
- Android权限系统
- Leetcode 76. Minimum Window Substring 最小子串窗口 解题报告
- MFC学生选课系统
- HDU 1284 钱币兑换问题 完全背包求方案数
- Window和WindowManager的分析
- PAT 1025 反转链表