Description

Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task. 

Your program will be given numbers and types of coins Charlie has and the coffee price. The coffee vending machines accept coins of values 1, 5, 10, and 25 cents. The program should output which coins Charlie has to use paying the coffee so that he uses as
many coins as possible. Because Charlie really does not want any change back he wants to pay the price exactly. 

Input

Each line of the input contains five integer numbers separated by a single space describing one situation to solve. The first integer on the line P, 1 <= P <= 10 000, is the coffee price in cents. Next four integers, C1, C2, C3, C4, 0 <= Ci <= 10 000, are the
numbers of cents, nickels (5 cents), dimes (10 cents), and quarters (25 cents) in Charlie's valet. The last line of the input contains five zeros and no output should be generated for it.

Output

For each situation, your program should output one line containing the string "Throw in T1 cents, T2 nickels, T3 dimes, and T4 quarters.", where T1, T2, T3, T4 are the numbers of coins of appropriate values Charlie should use to pay the coffee while using as
many coins as possible. In the case Charlie does not possess enough change to pay the price of the coffee exactly, your program should output "Charlie cannot buy coffee.".

Sample Input

12 5 3 1 2
16 0 0 0 1
0 0 0 0 0

Sample Output

Throw in 2 cents, 2 nickels, 0 dimes, and 0 quarters.

Charlie cannot buy coffee.

这题可以用多重背包,用dp[m][5]分别记录m价钱刚好能买到的物品个数的最大值,买1元,5元,10元,25元物品的个数。

#include<stdio.h>
#include<string.h>
#define inf 88888888
int max(int a,int b){
return a>b?a:b;
}
int w[10]={0,1,5,10,25},v[10]={1,1,1,1,1,1};
int dp[10006][6];
int main()
{
int n,m,i,j,a,b,c,d,k,ans,sum;
int num[19];
while(scanf("%d%d%d%d%d",&m,&num[1],&num[2],&num[3],&num[4])!=EOF)
{
if(m+num[1]+num[2]+num[3]+num[4]==0)break;
if(m>num[1]+num[2]*5+num[3]*10+num[4]*25){
printf("Charlie cannot buy coffee.\n");continue;
}
if(num[1]>=m){
printf("Throw in %d cents, 0 nickels, 0 dimes, and 0 quarters.\n",m);continue;
}
for(i=0;i<=m;i++){
dp[i][0]=-inf;
}
dp[0][0]=dp[0][1]=dp[0][2]=dp[0][3]=dp[0][4]=0; for(i=1;i<=4;i++){
ans=num[i]*w[i];
if(ans>=m){
for(j=w[i];j<=m;j++){
if(dp[j-w[i]][0]>=0){
if(dp[j-w[i]][0]+v[i]>dp[j][0]){
dp[j][0]=dp[j-w[i]][0]+v[i];
dp[j][1]=dp[j-w[i]][1];dp[j][2]=dp[j-w[i]][2];dp[j][3]=dp[j-w[i]][3];dp[j][4]=dp[j-w[i]][4];
dp[j][i]++; }
}
}
}
else{
k=1;sum=0;
while(sum+k<num[i]){
sum+=k;
for(j=m;j>=k*w[i];j--){
if(dp[j-k*w[i]][0]>=0){
if(dp[j-k*w[i]][0]+k*v[i]>dp[j][0]){
dp[j][0]=dp[j-k*w[i]][0]+k*v[i];
dp[j][1]=dp[j-k*w[i]][1];dp[j][2]=dp[j-k*w[i]][2];dp[j][3]=dp[j-k*w[i]][3];dp[j][4]=dp[j-k*w[i]][4];
dp[j][i]+=k; }
} }
k=k*2;
}
k=num[i]-sum;
for(j=m;j>=k*w[i];j--){
if(dp[j-k*w[i]][0]>=0){
if(dp[j-k*w[i]][0]+k*v[i]>dp[j][0]){
dp[j][0]=dp[j-k*w[i]][0]+k*v[i];
dp[j][1]=dp[j-k*w[i]][1];dp[j][2]=dp[j-k*w[i]][2];dp[j][3]=dp[j-k*w[i]][3];dp[j][4]=dp[j-k*w[i]][4];
dp[j][i]+=k; }
} }
}
}
if(dp[m][0]>0)
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",dp[m][1],dp[m][2],dp[m][3],dp[m][4]);
else printf("Charlie cannot buy coffee.\n");
//printf("%d\n",dp[m][0]);
}
return 0;
}

poj1787 Charlie's Change的更多相关文章

  1. poj1787 Charlie's Change

    思路: 完全背包,记录路径. 实现: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; ] ...

  2. (多重背包+记录路径)Charlie's Change (poj 1787)

    http://poj.org/problem?id=1787   描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...

  3. Charlie's Change(完全背包+路径记忆)

    Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3176   Accepted: 913 D ...

  4. Charlie's Change(完全背包记录路径)

    Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...

  5. Charlie's Change POJ - 1787

    Time limit 1000 ms Memory limit 30000 kB description Charlie is a driver of Advanced Cargo Movement, ...

  6. poj 1787 Charlie's Change (多重背包可作完全背包)

    Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3792   Accepted: 1144 ...

  7. B - Charlie's Change

    Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...

  8. [POJ 1787]Charlie's Change (动态规划)

    题目链接:http://poj.org/problem?id=1787 题意:有4种货币分别是1元,5元,10元,20元.现在告诉你这四种货币分别有多少个,问你正好凑出P元钱最多可以用多少货币.每种货 ...

  9. POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)

    网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以. 自己做的时候,还没了解过多重背包,该题直接往完全背包思考了.咖啡的钱看作总的背包容量,1.5.10.25分别代表四种物品的重量, ...

随机推荐

  1. Flink SQL结合Kafka、Elasticsearch、Kibana实时分析电商用户行为

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...

  2. Docker学习笔记之搭建Docker私有仓库

    Docker仓库服务器名为Docker注册(registry)服务器.可以使用docker push命令将镜像上传到注册服务器,也可以使用docker pull命令下载服务器的镜像. Docker注册 ...

  3. linux最大打开文件句柄数

    linux最大打开文件句柄数,即打开文件数最大限制,就是规定的单个进程能够打开的最大文件句柄数量(Socket连接也算在里面,默认大小1024) liunx中文件句柄有两个限制,一种是用户级的,一种是 ...

  4. 目前用下来最溜的MacOS微信多开工具!

    一个生活微信,一个工作微信是很多上班族的基本配置. 但由于微信客户端在PC端上只能打开一个,这使得在上班时候就非常不便,一个号在PC端上登录,一个在手机上使用,但是上班时候又不能一直看手机,不然老板还 ...

  5. typora+PicGo+gitee搭建免费的的床

    一.gitee 1.第一步拥有自己的gitee账号 没有的可以自己去注册gitee地址 2.使用自己的gitee账号创建仓库 创建好之后注意 记住.com/以后的地址 此处就为y***L/photo- ...

  6. js 前端词典对象的属性和值读取

    通常服务端返回比较奇葩的数据对象,不知道该怎么将这个对象转换为可用实体,想了很久,突发奇想想到了这么个方法. 需求是这样:企业有多个产品,产品有分为很几个种类.服务端有获取产品的接口,和单独获取产品种 ...

  7. linux GPU上多个buffer间的同步 —— ww_mutex、dma-fence的使用 笔记

    原文链接:https://www.cnblogs.com/yaongtime/p/14111134.html   WW-Mutexes   在GPU中一次Render可能会涉及到对多个buffer的引 ...

  8. 使用bandit对目标python代码进行安全函数扫描

    技术背景 在一些对python开源库代码的安全扫描中,我们有可能需要分析库中所使用到的函数是否会对代码的执行环境造成一些非预期的影响.典型的例如python的沙箱逃逸问题,通过一些python的第三方 ...

  9. ShardingSphere内核原理 原创 鸽子 架构漫谈 2021-01-09

    ShardingSphere内核原理 原创 鸽子 架构漫谈 2021-01-09

  10. Jenkins部署springboot项目

    记录jenkins如何部署springboot项目(jar类型的) 一.首先需要先配置好jenkins的基本配置(jdk.maven--),可在系统管理-->>全局工具配置中进行配置. 配 ...