杭电-2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
2016-07-26 15:05
232 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
相比于01背包和完全背包,多重背包由于每种物品的个数是固定的,因此要多了一层循环,用来变更物品的取用个数。
但是三重循环有时候可能会出现超时之类的问题~所以我们可以将其转化成01背包问题后再进行二进制优化
下面是《背包九讲》给出的模板,因为是背包基础题,所以这道题直接用模板就搞定勒
解题代码:
相比于01背包和完全背包,多重背包由于每种物品的个数是固定的,因此要多了一层循环,用来变更物品的取用个数。
但是三重循环有时候可能会出现超时之类的问题~所以我们可以将其转化成01背包问题后再进行二进制优化
下面是《背包九讲》给出的模板,因为是背包基础题,所以这道题直接用模板就搞定勒
def MultiplePack( F , C , W , M ) if C · M ≥ V CompletePack( F , C , W ) return k := 1 while k < M ZeroOnePack( kC , kW ) M := M − k k := 2k ZeroOnePack( C · M , W · M )
解题代码:
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int dp[110]; struct meat { int price; int weight; int bag; }; struct meat mym[110]; int n,m; void CompletePack(int weight,int price) { for(int i=price;i<=n;i++) { dp[i]=max(dp[i],dp[i-price]+weight); } } void ZeroOnePack(int weight,int price) { for(int i=n;i>=price;i--) { dp[i]=max(dp[i],dp[i-price]+weight); } } void MultiplePack(struct meat my_meat[]) { for(int i=1;i<=m;i++) { if(my_meat[i].price*my_meat[i].bag>=n) CompletePack(my_meat[i].weight,my_meat[i].price); else { int k=1; while(k<my_meat[i].bag) { ZeroOnePack(k*my_meat[i].weight,k*my_meat[i].price); my_meat[i].bag-=k; k=k*2; } ZeroOnePack(my_meat[i].bag*my_meat[i].weight,my_meat[i].bag*my_meat[i].price); } } } int main() { int tests; scanf("%d",&tests); while(tests--) { memset(dp,0,sizeof(dp)); memset(mym,0,sizeof(mym)); scanf("%d %d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&mym[i].price,&mym[i].weight,&mym[i].bag); } MultiplePack(mym); printf("%d\n",dp ); } return 0; }
相关文章推荐
- Java自动内存管理机制(四) 垃圾收集算法
- abstract抽象类
- 使用百度地图报错:Authentication Error errorcode: 230 uid: -1 appid -1 msg: APP Scode码校验失败
- win8.1 安装Oracle 10g 32位 出错解决办法
- Jeff and Periods
- hibernate通过配置文件生成数据库信息
- Java工程师成神之路~
- [LeetCode] 55. Jump Game
- 创建 多个 MySQL docker 出现错误时
- C#之委托
- 【机器学习】支持向量机(一)——最大间隔法与核函数
- dede开发--修改文档简介字数
- Kotlin使用(一)
- 今天做了点东西
- (原)String类两种实例化的区别
- AngularJS digest循环
- UIDatePicker
- 在线代码格式化
- fd_set 用法
- 克隆-浅表副本与深层副本