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

题意:

你有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 j = 0; j < 4; j++) {
			for(int k = 0; k < 2; k++) {
				for(int a1 = 0; a1 <= i; a1++) {
					for(int a2 = 0; a2 <= j; a2++) {
						for(int a3 = 0; a3 <= k; a3++) {
							ok[i][j][k][a1*10+a2*20+a3*50] = true;
						}
					}
				}
			}
		}
	}
}
int main() {
	init();
	int t, n;
	cin>>t;
	while(t--) {
		bool flag = true; 
		cin>>n;
		for(int i = 0; i < n; i++) {
			cin>>a[i];
			if(a[i] % 10 != 0){
				flag = false;
			}
		}
		if(!flag){
			puts("-1");
			continue;
		}
		int minn = inf;
		for(int i = 0; i < 2; i++) {
			for(int j = 0; j < 4; j++) {
				for(int k = 0; k < 2; k++) {
					int sum = 0, ret;
					for(int h = 0; h < n; h++) {
						if(a[h] >= 100 && ok[i][j][k][a[h]%100+100]) {
							ret = a[h] / 100 - 1;
						} else if(ok[i][j][k][a[h]%100]) {
							ret = a[h] / 100;
						} else {
							ret = inf;//无法组成 则给予一个很大的数字
						}
						sum = max(sum, ret);
					}
					minn = min(minn, sum + i+j+k);
				}
			}
		}
		cout<<minn<<endl;
	}
	return 0;
}
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务