藍橋杯——找零錢問題

本文參考自: 原文地址

題目描述:

用給定的幾種錢幣湊成某個錢數,一般而言有多種方式。
  例如:給定了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;
} 

程序大致流程:輸入總額,輸入最少找零紙幣數。如果不能找到,則輸入提示信息。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章