腾讯2019提前批笔试-----硬币题解

算法描述:

牛家村的货币是一种很神奇的连续货币.
他们货币的最大面额是n,并且一共有面额为1,面额为2,...,面额为n,n种面额的货币.
牛牛每次购买商品都会带上所有面额的货币,支付时会选择给出数量最小的方案.
现在告诉你牛牛将要购买的商品的价格,你能算出牛牛支付的硬币数量吗?
第一行两个整数n,m.表示货币的最大面额和商品的价格.

输出描述:
一个整数表示牛牛支付的硬币数量.
输入6 7
输出 2
输入 4 10
输出3

算法思路:这是一道典型的贪心算法题解.因为要选择给出数量最小的方案,所以每次应该选择最大的硬币.直到最大面额再加1时会超过价格时,再选取小一点的硬币面额进行添加,直到与价格一样.

举例:

6 7,先计算出7中可以用多少个面额为6的硬币,A=7/6=1,再用7-1*6=1;再只需一个面额为1的硬币就满足要求.

4 10,先计算出10中可以用多少个面额为4的硬币,A=10/4=2,再计算出剩余10-4*2=2,只需一个面额为2的硬币就满足要求.

代码实现:

#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
	//n表示最大面额,m表示价格
	int n, m;
	int A;
	cin >> n >> m;
	int count = 0;
	while (m)
	{
		if (m >= n)
		{
			 A = m / n;
			count += A;
			m = m - n*A;
		}
		else//m<=n
		{
			n = m;
		}
	}
	cout << count << endl;
	return 0;
}

附加一关于贪心算法计算硬币个数问题,可以更好的理解.

币种统计问题:

问题描述:某单位给每个职工发工资.为了保证不要临时兑换零钱,且取款的张数最少,
取工资前要统计出所有职工的工资所需各种币值(100,50,20,10,5,2,1)的张数.

算法策略:
1)数据结构选取:利用数组来存储面额,再利用一个数组来存储每个面额所需的张数.
2)算法步骤:
    输入人员个数,然后输入每个人员的工资
    对工资进行分解,每次选取最大的面值来凑,所以面值以大到小来排序.

代码实现:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

bool cmp(const int&a, const int& b)
{
	return a > b;
}
int main4()
{
	//初始化
	int GZ, M[7] = {0}, S[7] = { 0 };

	//人员
	cout << "请输入工作人员的人数";
	int n;
	cin >> n;
	cout << "请输入面额:";
	//初始化面额,并从大到小排序
	for (int i = 0; i < 7; ++i)
	{
		cin >> M[i];
	}
	sort(M,M+7,cmp);

	for (int i = 0; i < n; ++i)
	{
		printf("请输入第%d未员工的工资:",i);
		cin >> GZ;
		for (int j = 0; j < 7; ++j)
		{
			int A = GZ / M[j];//需要多少张此面额
			S[j] = S[j] + A;//进行数量累加
			GZ = GZ - A*M[j];//计算剩余的GZ
		}
	}
	for (int i = 0; i < 7; ++i)
	{
		printf("面值%d所需的张数为:%d\n",M[i],S[i]);
	}
	return 0;
}
发布了40 篇原创文章 · 获赞 23 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/suoyudong/article/details/89294372