算法描述:
牛家村的货币是一种很神奇的连续货币.
他们货币的最大面额是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;
}