SDUT 3321 背包 多重背包或多重背包+完全背包优化
2015-09-15 21:05
260 查看
硬币问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
现在有一些硬币,将这些硬币按面值分组可以分为n组,第i组的面值为Ai,数量为Ci,现在问这些硬币可以组成多少种不超过总价值不超过m的支付方式。输入
多组输入。对于每组数据,第一行为两个整数n,m(1 <= n <= 100,1 <= m <= 100000) 。
接下来的一行有n个整数Ai,n个整数Ci(1 <= Ai <= 10000,1 <= Ci <= 1000) 。
文件的最后一行为两个0,代表输入结束。
输出
对于每组数据,输出一行,包含一个整数代表答案。示例输入
3 101 2 42 1 12 5 1 42 10 0
示例输出
84
提示
来源
示例程序
多重背包 //800ms#include <cstdio> #include <cmath> #include <cctype> #include <vector> #include <queue> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int Max = 100100; int dp[Max]; int c[110]; int p[110]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=0; i<n; i++) scanf("%d",&p[i]); for(int i=0; i<n; i++) scanf("%d",&c[i]); memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) { int bite=1; int ans=c[i]; while(ans) { ans-=bite; for(int j=m;j>=bite*p[i];j--) { dp[j]=max(dp[j],dp[j-bite*p[i]]+bite*p[i]); } if(ans>=bite*2) bite*=2; else bite=ans; } } int sum=0; for(int i=1;i<=m;i++) //dp[i],i表示背包的容量,dp[i],表示容量为i时 可最大存的价值. { if(dp[i]==i) sum++; } printf("%d\n",sum); } }
多重背包+完全背包优化
#include <cstdio> #include <cmath> #include <cctype> #include <vector> #include <queue> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int Max = 100100; int dp[Max]; int c[110]; int p[110]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=0; i<n; i++) scanf("%d",&p[i]); for(int i=0; i<n; i++) scanf("%d",&c[i]); memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) { if(c[i]*p[i]>=m) //大于m时 用完全背包优化<span id="transmark"></span> { for(int j=p[i];j<=m;j++) dp[j]=max(dp[j],dp[j-p[i]]+p[i]); continue; } int bite=1; int ans=c[i]; while(ans) { ans-=bite; for(int j=m;j>=bite*p[i];j--) { dp[j]=max(dp[j],dp[j-bite*p[i]]+bite*p[i]); } if(ans>=bite*2) bite*=2; else bite=ans; } } int sum=0; for(int i=1;i<=m;i++) { if(dp[i]==i) sum++; } printf("%d\n",sum); } }
相关文章推荐
- 360笔试题————计算器格式输出一个数的素因子乘积
- 数据库分页查询技术以及实现查询随机数
- Netty5入门学习笔记003-TCP粘包/拆包问题的解决之道(下)
- 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)
- Java使用MyEclipse构建webService简单案例
- 自定义函数[不断添加]
- GooglePlay内购In-app Billing 总结~
- 记录linux下c++编程
- 带头结点的单链表的操作 学习总结
- android之gradle构建工具学习之路(二)
- 退役狗回来继续写博客……C++数据结构//我觉得自己深深地被djh老师给欺骗了
- hdu5439 二分
- 矩阵快速幂
- 第三十九天 手机媒体应用:SoundPool(播放提示音)、录音、视频播放、本地相机
- 黑盒测试
- ApplicationContextAware的理解
- ### C++总结-[类的继承]
- 线程同步
- 1001_Alisha’s Party_2015 ACM/ICPC Asia Regional Changchun Online(优先队列)
- 软件测试方法和技术 之 基本名词都搞清楚篇