算法题每日一练---第31天:换零钱

546 阅读2分钟

「这是我参与2022首次更文挑战的第32天,活动详情查看:2022首次更文挑战

一、问题描述

X 星球的钞票的面额只有:100 元,5 元,2 元,1 元,共 4 种。

小明去 X 星旅游,他手里只有 2 张 100 元的 X 星币,太不方便,恰好路过 X 星银行就去换零钱。

小明有点强迫症,他坚持要求 200 元换出的零钞中 2 元的张数刚好是 1 元的张数的 10 倍,剩下的当然都是 5 元面额的。

银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?(5 元,2 元,1 元面额的必须都有,不能是 0)

二、题目要求

考察

1.数学思想,循环判断
2.建议用时5~15min

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

三、问题分析

7.png

我读完题目就有了一个大概的思路,把握住问题的整体思路之后就可以轻松的解决掉这一题。

首先,问题的关键就在于能否求出最少的钞票数量,那么想要钞票数量少,该怎么办?面值必须要大啊!

所以,我一开始就考虑5元的数量达到最大,依次向下递减,直到找到符合下面的两个条件的钞票数目,输出结果。在if循环里面关键的两个判断条件如下:

条件1: 3种钞票的总面值必须要等于200
条件2: 2元的张数刚好是1元的张数的10倍

四、编码实现

#include<iostream>
using namespace std;
int main()
{
	int i,j,k,n=200;//初始化数据,i,j,k分别代表5 2 1面值
	for(i=39;i>=1;i--)//让五元面值的钞票数量最多
	{
		for(j=1;j<=100;j++)//二元面值的钞票数目
		{
			for(k=1;k<=200;k++)//一元面值的钞票数目
			{
				if(5*i+2*j+k==n&&j==10*k)//满足上面提到的两个条件即可
				{
					cout<<i+j+k<<"\n";//输出最后的结果
				}
			}
		}
	}
	return 0;
}

五、输出结果

输出具体的结果为:74

1.png