B - Charlie's Change
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的更多相关文章
- (多重背包+记录路径)Charlie's Change (poj 1787)
http://poj.org/problem?id=1787 描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...
- Charlie's Change(完全背包+路径记忆)
Charlie's Change Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3176 Accepted: 913 D ...
- Charlie's Change(完全背包记录路径)
Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...
- Charlie's Change POJ - 1787
Time limit 1000 ms Memory limit 30000 kB description Charlie is a driver of Advanced Cargo Movement, ...
- poj 1787 Charlie's Change (多重背包可作完全背包)
Charlie's Change Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3792 Accepted: 1144 ...
- poj1787 Charlie's Change
Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...
- [POJ 1787]Charlie's Change (动态规划)
题目链接:http://poj.org/problem?id=1787 题意:有4种货币分别是1元,5元,10元,20元.现在告诉你这四种货币分别有多少个,问你正好凑出P元钱最多可以用多少货币.每种货 ...
- POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)
网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以. 自己做的时候,还没了解过多重背包,该题直接往完全背包思考了.咖啡的钱看作总的背包容量,1.5.10.25分别代表四种物品的重量, ...
- poj 1787 Charlie's Change
// 题意 给定一个数p,要求用四种币值为1,5,10,25的硬币拼成p,并且硬币数要最多,如果无解输出"Charlie cannot buy coffee.",1<=p&l ...
随机推荐
- Js逆向-滑动验证码图片还原
本文列举两个例子:某象和某验的滑动验证 一.某验:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s 未还原图像: 还原后的图: ...
- ES6引入的Reflect对象目的何在?
Reflect对象其实就是为了取代Object对象.取代原因有一下几点: 1)Object对象的一些内部方法放在了Reflect上面,比如:Object.defineProperty.主要是优化了语言 ...
- golang 交叉编译 win开发 linux生产
windows平台之下使用 go env 能看到go本身的配置的环境变量,其中红框框起来的变量是交叉编译需要改动的选项, 由于是win平台开发,但是跑起来的程序都是在linux,所以linux转win ...
- python虚拟环境安装使用
# 安装 pip install virtualenv pip install virtualenvwrapper-win # win环境下 liunx下不需要-win #创建一个文件夹并cd进去mk ...
- chrome安装扩展插件出现-crx_header_invalid问题
1. 将*.crx文件重命名为*.rar 2.将rar文件解压 3. 在chrome浏览器添加扩展程序时选择“加载已解压的扩展程序” 4.添加成功
- def跨域+jwt
1.跨域 由于浏览器具有“同源策略”的限制.如果在同一个域下发送ajax请求,浏览器的同源策略不会阻止.如果在不同域下发送ajax,浏览器的同源策略会阻止. 总结 域相同,永远不会存在跨域. crm, ...
- Python3 面向对象之:多继承
多继承 class ShenXian: # 神仙 def fei(self): print("神仙都会⻜") class Monkey: # 猴 def chitao(self): ...
- vue练手项目——桌面时钟
用vue实现一个简单的网页桌面时钟,主要包括时钟显示.计时.暂停.重置等几个功能. 效果图如下,页面刚进来的时候是一个时钟,时钟上显示的时.分.秒为当前实际时间,点击计时器按钮后,页面变成一个计时器, ...
- Centos7安装Elasticsearch和Kibana
这里使用的6.6.0版本,ES需要JDK环境,对应1.8 Elasticsearch安装: 1.下载:https://elasticsearch.cn/download/ 2.解压: 3.修改配置:j ...
- 【Java】反射调用与面向对象结合使用产生的惊艳
缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑 ...