这道题感觉好复杂啊,有没有兄弟指点解决一下

img

供参考:

#include<stdio.h>
int main()
{
    int M[6]={100,50,20,10,5,1},c_M[6]={0},n,m,i,s=0;
    scanf("%d",&n);
    while(n--){
              scanf("%d",&m);
              s += m;
              for(i=0;m!=0;i++){
                  c_M[i] += m/M[i];
                  m %= M[i];
              }
    }
    printf("%d\n%d %d %d %d %d %d",s,c_M[0],c_M[1],
                         c_M[2],c_M[3],c_M[4],c_M[5]);
    
    return 0;
}

//3
//1200 1341 1567
//4108
//40 1 2 1 1 3请按任意键继续. . .

照片有点看不清啊😂特别是那个input和output

img

4108=40乘100+50乘1+20乘2+10乘1+5乘1+1乘3,后面两行没有看清,不清楚到底要问啥😂😂(星号打出来了没显示出来,只好用汉字写了)


#include <stdio.h>
#include <stdlib.h>
int main()
{
  int n, i, s;
  int *salary;
   scanf("%d",&n);
   salary = (int*)malloc( n*sizeof(int) );
   s = 0;
   for(i=0; i<n; i++){
     scanf("%d",&salary[i]);
     s = s + salary[i];
   }
    printf("%d\n",s);
    printf("%d ",s/100); s = s%100;
    printf("%d ",s/50);  s = s%50;
    printf("%d ",s/20);  s = s%20;
    printf("%d ",s/10);  s = s%10;
    printf("%d ",s/5);  s = s%5;
    printf("%d ",s);
    return 0;
}

img

4108除以100取整输出,余数除以50,以此类推,再加个判断函数,如果输出数为零,返回上一级,输出数减一,重新算一下余数,可以考虑一下用递归,普通函数也可以

每个人的工资单独求余计算最少人民币张数
每个面值单独变量初始化为0求一次变量加一次

这个分匀的要求应该是保证每个面额>=1吧,那可以先每个面额分一次,剩下的再重新分配啊。
比如4108
每个面额先分一次就剩
4108-186=3922
3922/100=39......22
22/50=0......22
22/20=1.....2
2/10=0......2
2/5=0.......2
2/1=2.....0
求出来结果是:39、0、1、0、0、2
再加上之前分配有的1
就是:40,1,2,1,1,3


 #include<iostream>
 using namespace std;
 int main()
 {
     int n;
     cin>>n;
     int arr[n];
     for(int a=0;a<n;a++)
     {    
         cin>>arr[a]; 
     };//输入人数和工资数。 
 
     int t=0;
for(int a=0;a<n;a++)
 {
 t+=arr[a];
 }
cout<<t<<endl;//这一步是求所有人的工资和。 


   int u=0;
for(int a=0;a<n;a++)
 {
     u+=arr[a]/100;
 }
cout<<u<<endl;//输出一百块有多少张。 

   int v=0;
for(int a=0;a<n;a++)
 {
     v+=arr[a]%100/50;
 }
cout<<v<<endl;//输出五十块有多少张。

   int w=0;
for(int a=0;a<n;a++)
 {
    w+=arr[a]%100%50/20;
 }
cout<<w<<endl;//输出二十块有多少张。

 int x=0;
for(int a=0;a<n;a++)
 {
     x+=arr[a]%100%50%20/10;
 }
cout<<x<<endl;//输出十块有多少张。

 int y=0;
for(int a=0;a<n;a++)
 {
     y+=arr[a]%100%50%20%10/5;
 }
cout<<y<<endl;//输出五块有多少张。

 int z=0;
for(int a=0;a<n;a++)
 {
     z+=arr[a]%100%50%20%10%5/1;
 }
cout<<z<<endl;  //输出一块有多少张。弄了一上午,终于搞出来了。 

return 0;//弄了一上午,终于搞出来了。 你自己可以验证一下,算几种面值分别有多少张应该还可以优化。 

}

这个题其实不难,就是有点绕。

这道题只是单纯的计算题,根本不是啥算法题。还出现啥贪心算法等等,都是扯。这种无需找零且要最小张数的,拿到一个人的工资,直接从大的开始除,余数接着除小的。所得的一定是结果一定是单个人最小张数(不找零原则)。 把每个人的结果加起来,就是全局最小张数。