HDU 2844 二进制优化的多重背包
2016-04-30 00:28
323 查看
Coins
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11596 Accepted Submission(s): 4634
[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
1 2 4 2 1 1
2 5
1 4 2 1
0 0
[align=left]Sample Output[/align]
8
4
[align=left]Source[/align]
2009 Multi-University Training Contest 3 - Host by WHU
题意:有不同面值的 相应数量不同n种硬币 问1~m元的价格有哪些 可以由硬币组成 f[i]==i
题解: 多重背包 二进制优化
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<queue> #include<stack> using namespace std; int n,m; struct node { int a,c; } N[105]; int f[110005]; int ans; int value[100005],size[100005]; int count; void slove(int q) { count=1; for(int i=1;i<=q;i++) { int c=N[i].c,v=N[i].a; for (int k=1; k<=c; k<<=1) { value[count] = k*v; size[count++] = k*v; c -= k; } if (c > 0) { value[count] = c*v; size[count++] = c*v; } } } int main() { while(scanf("%d %d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(int i=0; i <= m; i++) f[i] = 0; ans=0; for(int i=1;i<=n;i++) scanf("%d",&N[i].a); for(int i=1;i<=n;i++) scanf("%d",&N[i].c); slove(n); for(int i=1;i<count;i++) for(int gg=m;gg>=size[i];gg--) f[gg]=max(f[gg],f[gg-size[i]]+value[i]); for(int i=1;i<=m;i++) if(f[i]==i) ans++; cout<<ans<<endl; } return 0; }
相关文章推荐
- PendingTransition实现炫酷的Activity切换动画
- 【LeetCode】Move Zeroes 解题报告
- C++接口(抽象类)
- 解决 Mac OS X 下 Nginx 编译报错 symbol(s) not found for architecture x86_64
- html中调用本地exe程序 打开文件或文件夹
- Codeforces #324 Div2 D.Dima and Lisa(三素数构造、哥德巴赫猜想)
- poj 1251 最小生成树 krusral算法
- lightoj1207Posters_For_Election&&POJ2528
- POJ 2983 差分约束系统
- 复星昆仲杨光:VR行业四大痛点
- Codeforces #324 Div2 C Marina and Vasya(构造)
- tools.js
- 《DATA+++》保护个人隐私的安全套装
- Python str内部功能介绍
- hdu 1087 Super Jumping! Jumping! Jumping!
- JDBC数据库连接
- Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis
- 初识Zookeeper
- 良好的布局与风格
- Codeforces #324 Div2 B.Kolya and Tanya(dp、思维)