hdu6685 Rikka with Coin【枚举】【思维】【2019 Multi-University Training Contest 9】

本文讲述了如何用枚举法解决支付任意价格的最少硬币数量问题。通过限制10元、20元和50元硬币的最大使用数量,确保不出现找零,然后对所有可能的硬币组合进行枚举,找到支付所有价格的最小硬币总数。
摘要由CSDN通过智能技术生成

题意:

你有10元硬币,20元硬币,50元硬币,100元硬币若干
现在有n个价格,请问最少带多少个硬币可以不用找钱能支付任意一个价格

题解:

首先10元的硬币最多只会用一个,如果用了两个,直接替换成一个10元、一个20元一定不亏。
20元的硬币最多只会用三个,如果用了四个,直接替换成一个10元、两个20元、一个50元一定不亏。
50元的硬币最多只会用一个,如果用了两个,直接替换成个50元和一个100元一定不亏。
对于任何一种情况,重复使用上述规则一定会达到一个10元硬币最多一个,20 元最多三个,50 元最多一个的情况,不会陷入重复甩锅的死循环。

然后对使用硬币的情况进行枚举,一共 2 * 4 * 2 = 16 种情况

对于每个价格,我们优先判断是否不小于100, 然后我们再把其拆出 (%100后的部分) + 100 和 若干个100进行组合,判断i个10和j个20和k个50能否组成 (%100后的部分) + 100,不能则再判断能否组成 (%100后的部分), 然后每次判断最多需要多少个100, 将16种情况枚举完取最小的答案。

AC_code:

#include<bits/stdc++.h>
#define inf 1e8
using namespace std;
bool ok[2][4][2][200];
int a[105];
void init() {
   
	memset(ok, false, sizeof(ok));
	for(int i = 0; i < 2; i ++) {
   
		for(int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值