本文参考自: 原文地址
题目描述:
用给定的几种钱币凑成某个钱数,一般而言有多种方式。
例如:给定了6种钱币面值为2、5、10、20、50、100,
用来凑 15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。
显然,最少需要2个钱币才能凑成15元。 你的任务就是,
给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
大家注意了这个是最少,刚看到朋友写了这个题目,之前我在想这个题目时思维总是定格在以自己大脑找最小零钱的过程,其实是并不好实现的,虽然朋友是用枚举做出来的,一般这个题目是填空题,所以不要太在乎方法。
我再说说我之前是怎么想的吧,我是想应该先从最大币值来依次找零,其实有时又要递归回去再判断,很麻烦的。
举个例子:31吧,从比不大于31的零钱来找零的过程是,36-20=16,16-10=6,6-5=1,到这发现没有零钱比这小了,所以得递归回去,1+5=6,因为刚刚减5行不通,所以得递推到上一步,那就往下一个小值找,那就是6-2=4,4-2=2,2-2=0这样找找到最小找零纸币数了。
这个过程可以用代码描述出来,我就是觉得麻烦,刚看到枚举还是很好接受的。
代码仅供参考,以后想到好方法会补上来。
#include<stdio.h>
int main()
{
int a,b,c,d,e,f;
int money;
printf("请输入所要找零的钱:");
scanf("%d",&money);
int s=money/2+1; //这个s初值为最多纸币数
int t=s;
for(a=0;a<=money/2+1;a++)
{
for(b=0;b<=money/5+1;b++)
{
for(c=0;c<=money/10+1;c++)
{
for(d=0;d<=money/20+1;d++)
{
for(e=0;e<=money/50+1;e++)
{
for(f=0;f<=money/100+1;f++)
{
if(f*100+e*50+d*20+c*10+b*5+a*2==money){
//printf("%d-%d-%d-%d-%d-%d\n",f,e,d,c,b,a);
if(a+b+c+d+e+f<s) s=a+b+c+d+e+f;
}
}
}
}
}
}
}
if(s==t) printf("找不到对应的零钱\n");
else
printf("所需最小纸币数为:%d\n",s);
return 0;
}
程序大致流程:输入总额,输入最少找零纸币数。如果不能找到,则输入提示信息。