博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2844 Coin 多重背包
阅读量:6219 次
发布时间:2019-06-21

本文共 3688 字,大约阅读时间需要 12 分钟。

Coins

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 6279    Accepted Submission(s): 2561

Problem Description
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.
 

 

Input
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.
 

 

Output
For each test case output the answer on a single line.
 

 

Sample Input
3 10
1 2 4
2 1 1
 
2 5
1 4
2 1
 
0 0
Sample Output
8
4
题解:英语不好,果然个个都赶脚是坑啊,唉,题意千万读懂了再做题,本题是多重背包的题目,A  表示硬币的价值, C  表示对应硬币的数量;典型的完全背包啊;
     1.首先是 n 表示 n 组数据,第一行输入价值 A, 第二行输入价值对应的数量 C ;用这些价值的硬币,组合出在 1 和 m ,之间的数(包括1,m);
     2.所以我们可以把,多重背包分成 01 和 完全背包 来解;如果遇见 A[i]*[i]>=m 按照完全背包,否则 01 背包;
AC代码一:
#include
#include
#include
int v[110];int w[110];int dp[100005];using namespace std;int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(v,0,sizeof(v)); memset(w,0,sizeof(w)); for(int i=1;i<=100005;i++) dp[i]=-9999999; dp[0]=1; for(int i=1; i<=n; i++) scanf("%d",&v[i]); for(int i=1; i<=n; i++) scanf("%d",&w[i]); for(int i=1; i<=n; i++) { if(v[i]*w[i]>=m)//完全背包 { for(int j=v[i]; j<=m; j++) { dp[j]=max(dp[j],dp[j-v[i]]+v[i]); } } else { for(int k=1; k<=w[i]; k=k*2) { for(int j=m; j>=v[i]*k; j--) { dp[j]=max(dp[j],dp[j-v[i]*k]+v[i]*k); } w[i]-=k; } if(w[i]>0) { for(int j=m; j>=v[i]*w[i]; j--) dp[j]=max(dp[j],dp[j-v[i]*w[i]]+v[i]*w[i]); } } } int count=0; for(int i=1; i<=m; i++) { if(dp[i]>=0) count++; } printf("%d\n",count); } return 0;}
View Code

AC代码二:

#include
#include
using namespace std; int a[200],c[200],F[100005]; void inline ZeroOnePack(int ResVal,int ResVol,int BpCap) { for(int i=BpCap;i>=ResVol;--i) { F[i]=max(F[i],F[i-ResVol]+ResVal); } } void inline CompletePack(int ResVal,int ResVol,int BpCap) { for(int i=ResVol;i<=BpCap;++i) { F[i]=max(F[i],F[i-ResVol]+ResVal); } } void MultiplePack(int ResVal,int ResVol,int ResNum,int BpCap) { if(ResVol*ResNum>=BpCap) { CompletePack(ResVal,ResVol,BpCap); } for(int i=0;(1<
<=ResNum;++i) { ZeroOnePack((ResVal<
<
>n>>m) { if(n+m==0) break; memset(F,0,sizeof(F)); for(i=0;i
>a[i]; for(j=0;j
>c[j]; for(i=0;i
View Code

 

转载地址:http://gzoja.baihongyu.com/

你可能感兴趣的文章
jsp页面div列表
查看>>
jsp页面table列表
查看>>
gradle 下载
查看>>
MVC开发Markdown编辑器(2)
查看>>
sicily 1345 能量项链
查看>>
jQuery基础:获取元素内容
查看>>
CRM 相关术语 (一)
查看>>
emacs common configurations
查看>>
彻底解决低端安卓手机touchend事件不触发(考虑scroll)
查看>>
find missing conjunction, why?
查看>>
AFN实现文件下载
查看>>
嵌入式开发之hi3519--- pcie dma和dma cache 缓存更新sync memery
查看>>
web 开发之js---ajax 异步处理
查看>>
必会重构技巧(五):划分职责
查看>>
TYVJ 1039 忠诚2 by C++
查看>>
C语言指针—————第一篇:函数参数的传递
查看>>
开源一个带自定义事件编程支持的javascript音频播放器,兼容IE和HTML5
查看>>
hadoop集群搭建
查看>>
【vue】清理代码
查看>>
数据结构学习心得系列(一)
查看>>