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[]的01背包,剩下的就是怎么初始化dp[]的问题,如果不会初始化 请点击传送门

题解如下

#include<iostream>
#include<string.h> using namespace std;
const int Len = 10005;
int dp[Len]; //⚠️ 一定要注意 dp 使用来存生什么的,是用来存储使用各种硬币的总数量
int path[Len][2]; //在存储空背包空间为j时 path[j][0] 存储的的是在dp[j]状态下使用的那种硬币,path[j][1] 为在存储了某种硬币后 所剩余的空间
int coin[4] = {1,5,10,25};
int ans[26]; //存储每种硬币使用的数量
struct Node
{
int num,all_pri,pri; //在进行二进制拆分后得到的 得到的一种新的硬币 这种新硬币消耗原来的 num个硬币,新硬币的价值是 all_pri,原来硬币的价值是 pri
}a[Len]; //存储记录转移情况 int main()
{
int cnt[4];
int cost;
while(scanf("%d%d%d%d%d",&cost,&cnt[0],&cnt[1],&cnt[2],&cnt[3]) && (cost + cnt[0] + cnt[1] + cnt[2] + cnt[3]))
{
int pos = 0; //二进制拆分后物品变成 pos 件
for(int t = 0;t < 4;t ++)
{
int count = cnt[t];
//这里就是进行 二进制 拆分
for(int k = 1;k <= count && k * coin[t] <= cost;k *= 2)
{
count -= k;
a[pos].num = k;
a[pos].all_pri = k * coin[t];
a[pos ++].pri = coin[t];
}
if(count) //二进制拆分的最后一个判读
{
a[pos].num = count;
a[pos].all_pri = count * coin[t];
a[pos ++].pri = coin[t];
}
} memset(dp,0,sizeof(dp));
dp[0] = 1; //⚠️这里恰好装满、使用完 情况初始化dp的技巧
memset(path,0,sizeof(path)); for(int i = 0;i < pos;i ++)
{
for(int j = cost;j >= a[i].all_pri;j --)
{
if(dp[j - a[i].all_pri] > 0 && dp[j - a[i].all_pri] + a[i].num > dp[j])
{
dp[j] = dp[j - a[i].all_pri] + a[i].num; //在
path[j][0] = i; //记录在 dp[j] 达到最大使用硬币使用数量时,消耗的是哪种硬币
path[j][1] = j - a[i].all_pri; //dp[j]达到最大使用硬币数量时背包中剩余的空间 (这里的操作时 是为了 方便回推 )
}
}
}
if(!dp[cost])
{
printf("Charlie cannot buy coffee.\n");
}
else
{
memset(ans,0,sizeof(ans));
int cost_ = cost;
while(cost_)
{
int i = path[cost_][0]; // 在背包空间为j的情况时(dp[j])达到最优情况使用了 第i件物品
ans[a[i].pri] += a[i].num; //使用第i种硬币时的 消耗 组成i硬币的某种硬币的数量
cost_ = path[cost_][1]; //这一句就是要 往状态转移方程的上一个 状态回退,因为选则了 i 这种硬币,所以背包剩余的空间为 path[cost_][1]
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",ans[1],ans[5],ans[10],ans[25]);
}
} return 0;
}

B - Charlie's Change的更多相关文章

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

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

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

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

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

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

  4. Charlie's Change POJ - 1787

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

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

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

  6. poj1787 Charlie's Change

    Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...

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

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

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

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

  9. poj 1787 Charlie's Change

    // 题意 给定一个数p,要求用四种币值为1,5,10,25的硬币拼成p,并且硬币数要最多,如果无解输出"Charlie cannot buy coffee.",1<=p&l ...

随机推荐

  1. JavaScript实现树结构(一)

    JavaScript实现树结构(一) 一.树结构简介 1.1.简单了解树结构 什么是树? 真实的树: 树的特点: 树一般都有一个根,连接着根的是树干: 树干会发生分叉,形成许多树枝,树枝会继续分化成更 ...

  2. Python知识点 - Xpath提取某个标签,需要转换为HTML。

        # lxml转Html from lxml import etree from HTMLParser import HTMLParser def lxml_to_html(text:etree ...

  3. Node.Js的热更新服务——supervisor

    因为目前项目每次修改文件要看效果,必须重启服务:node app.js再进入浏览器看效果,很是麻烦.所幸的是有很多第三方的管理工具(supervisor,hotnode,forever,pm2等),当 ...

  4. 脚本写一行echo也能写出bug ? glob了解一下

    背景 最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a. 最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的. 又经过 ...

  5. PHP的json_encode和json_decode的区别

    经常搞混的两个PHP函数: json_encode()是对变量进行json编码 json_encode()为要编码的值,且该函数只对utf8编码的数据有效 json_decode($json)对jso ...

  6. Go语言:如何解决读取不到相对路径配置文件问题

    背景 项目交叉编译为可执行文件之后,在其他目录执行文件时提示找不到配置文件 2020/03/14 20:44:23 配置文件读取失败 open config.ini: no such file or ...

  7. Linux监控系统相关资源和运行状态命令整理

    #前言:Linux系统自带了些实时查看监控系统运行状态的相关命令,接下来我们就来了解一下. #首先我们先来了解一下什么是进程 #进程:是Linux用来表示正在运行的程序的一种抽象概念,Linux系统上 ...

  8. Docker极简部署Kafka+Zookeeper+ElasticStack

    之前写ELK部分时有朋友问有没有能一键部署的Kafka+ELK,写本文主要是填这个坑,基本上配置已经集中在一两个文件中了,理论上此配置支持ElasticStack 7.x所有版本 本文所有配置与代码均 ...

  9. MySQL 【教程二】

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: # CREATE TABLE table_name (c ...

  10. asp:textbox 的 TextMode:password

    1.  用于输入或显示密码的文本框,设置属性TextMode为Password <asp:TextBox ID="txt_Password" runat="serv ...