【题目描述】
财务处要给公司的n位员工发工资了,请你帮助计算最少要多少张人民币才能给每位员工发工资而不必找零呢?已知人民币的面额为100元,50元,10元,5元,2元和1元这6种。
【输入格式】
第一个值为正整数n,后面接着n个正整数表示n位员工的工资
【输出格式】
一行一个整数输出一共要准备的人民币张数。
【输入样例】
3 1 2 3
【输出样例】
4
先叨叨两句:作为一个小菜鸡,也是第一次开始创作,后续会一直记录平时的练习和作业。实际上自己写代码的时候,没有那么多注释,准备发上来,所以添了很多注释。因为如果它能有幸帮助到初学者,希望你们都能看懂,看懂了再复制粘贴(我大一就查找到资源直接交作业,然后美美挂科~~)。当然如果能被大佬发现这些文章,希望得到批评指正(希望学会更好的算法)!谢谢看完这段废话的兄弟姐妹萌~
代码如下:
#include<iostream>
using namespace std;
int main()
{
int n, *p, count=0;// count记录所需人民币张数
int a[6] = {100,50,10,5,2,1};//面额
cin>>n; //员工数
p = new int[n]; //利用指针建立动态数组
for(int i=0;i<n;i++)
{
cin>>p[i];
}
int t = n;//t:保存待计算员工人数
while(t != 0)
{ //每计算完成一位员工所需数量,t--,直到全体员工计算完成后跳出循环
for(int i = 0; i < n; i++) //从第0位员工算到第n-1个
{
for(int j = 0; j < 6; j++)//需要最小数量,即需从最大面额开始计算
{
if(p[i] >= a[j]) //员工工资大于当前面额
{
//k:记录当前面值的钱需要多少张
int k = p[i] / a[j];
count += k;
p[i] -= k * a[j]; //为下一面额作准备
}
}
}
t--;
}
cout<<count<<endl;
return 0;
}
解题思路:
(1) 求最少需要多少张,即面值最大的尽可能用的多,所需的总数才越少(关键!)
(2) 先用最大面值的钱来填数,再用次小的面值来填数,比如280的工资,先发2个一百的;剩余80,先发1个50;最后剩余30,发3个10块;总共6张
(3) 外层循环控制,将每位员工所需数目都计算出来