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

本文共 3740 字,大约阅读时间需要 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

 

转载于:https://www.cnblogs.com/lovychen/p/3658347.html

你可能感兴趣的文章
apache 伪静态 .htaccess
查看>>
unity3d 截屏
查看>>
ASP.NET MVC学习之控制器篇
查看>>
MongoDB ServerStatus返回信息
查看>>
分析jQuery源码时记录的一点感悟
查看>>
程序局部性原理感悟
查看>>
UIView 动画进阶
查看>>
Spring如何处理线程并发
查看>>
linux常用命令(用户篇)
查看>>
获取组件的方式(方法)
查看>>
win2008 server_R2 自动关机 解决
查看>>
我的友情链接
查看>>
在C#调用C++的DLL简析(二)—— 生成托管dll
查看>>
Linux macos 常用终端操作
查看>>
企业网络的管理思路
查看>>
Linux磁盘分区与挂载
查看>>
J2se学习笔记一
查看>>
DNS视图及日志系统
查看>>
老李分享:Android性能优化之内存泄漏 3
查看>>
mysql命令
查看>>