Coins(hdu 2844 多重背包)
2015-12-18 11:43
567 查看
Coins
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10632 Accepted Submission(s): 4230
[align=left]Problem Description[/align]
Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn't know the exact price of the watch.
You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
[align=left]Input[/align]
The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000). The last test case is followed by two zeros.
[align=left]Output[/align]
For each test case output the answer on a single line.
[align=left]Sample Input[/align]
3 10 //n面值种类,m最大价格
1 2 4 2 1 1 // 3种面值,对应个数,求最多能凑出多少种小于等于m的钱数
2 5
1 4 2 1
0 0
[align=left]Sample Output[/align]
8
4
一开始想到用母函数求解,数据量有点大,看了discuss然后用多重背包+二进制优化,二进制优化不能用pow函数,不然依然超时。。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int val[100+10],num[100+10]; int c1[100000+1],c2[100000+1]; int m,n; int solve() { int ans=0,u; int i,j,k,p=num[1]*val[1]; int t=min(val[1]*num[1],m); for(i=0;i<=t;i+=val[1]) c1[i]=1; for(i=0;i<=t;i++) c2[i]=0; for(i=2;i<=n;i++) { for(j=0;j<=p;j++) { u=-1; for(k=0;j+k<=m;k+=val[i]) { u++; if(u>num[i]) break; c2[j+k]+=c1[j]; } } p=j+k; for(j=0;j<=p;j++) { c1[j]=c2[j]; c2[j]=0; } } for(i=1;i<=m;i++) { if(c1[i]!=0) ans++; } return ans; } int main() { int i,j; freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)) { if(m==0&&n==0) return 0; for(i=1;i<=n;i++) scanf("%d",&val[i]); for(i=1;i<=n;i++) scanf("%d",&num[i]); cout<<solve()<<endl; } return 0; }
View Code
相关文章推荐
- Python 文件操作模块 shutil 详解
- 基于屏幕触摸事件的签名实现和对签名的保存
- 在C++中侦测内嵌型别的存在(rev#2)
- RTP协议分析
- 基于Java+Require+Angular+Bootstrap+MySQL的Admin
- oracle数据库审计
- 深入理解 Java中的 流 (Stream)
- 在 Linux 上找出并解决程序错误的主要方法
- AEAI BPM流程集成平台V3.0.2版本开源发布
- iOS 视图,动画渲染机制探究
- 一个有两秒轮询滚动的scrollView
- Centos 6.7 安装 php 5.5
- Python基础教程 第7章: 更加抽象(类) 学习笔记
- STL - Unorderedset - 自定义哈希函数
- SDWebImage的实现原理
- 社会经验-职场经验(以后自己做老板需要警觉)
- 简单的缓存代理HTTP服务器
- 直接拿来用!最火的Android开源项目(完结篇)
- Docker环境下部署Gitlab
- Fiddler与Charles的异同