ACM藍橋杯之換硬幣問題
阿新 • • 發佈:2019-01-19
代碼 code ret 範圍 ace str include for 介紹
代碼如下:
題目描述:
想兌換100元零錢,有1元、2元、5元、10元四種面值,總有多少種兌換方法?
解題思路:
本題可以采用多種方法求解。最容易理解的應該就是暴力窮舉和遞歸求解。那麽本文主要介紹這兩種解法。
暴力窮舉:
100元換成1元,2元,5元,10元四種面值,那麽考慮四種臨界情況:
如果全部換成1元硬幣, 則可換100個。
如果全部換成2元硬幣, 則可換50個。
如果全部換成5元硬幣, 則可換20 個。
如果全部換成10元硬幣,則可換10個。
所以窮舉範圍就很清楚了,如果定義變量a,b,c,d分別表示1元,2元,3元,4元硬幣的個數。那麽:
0<=a<=100; 0<=b<=50 ; 0<=c<=20 ; 0<=d<=10 ;
代碼如下:
#include <stdio.h> int main() { int g_count=0; int a,b,c,d; for(a=0; a<=100; a++) { for(b=0; b<=50; b++) { for(c=0; c<=20; c++) { for(d=0; d<=10; d++) { if(100==a+2*b+5*c+10*d) { g_count++; } } } } } printf("%d\n",g_count); return 0; }
遞歸算法:
#include <iostream> using namespace std; const int N = 100; int dimes[] = {1, 2, 5, 10}; int arr[N+1] = {1}; int coinExchange(int n, int m) //遞歸方式實現,更好理解 { if (n == 0) //跳出遞歸的條件 return 1; if (n < 0 || m == 0) return 0; return (coinExchange(n, m-1) + coinExchange(n-dimes[m-1], m)); //分為兩種情況:換取當前面值的情況 + 沒有換取當前面值的情況 //如果沒有換當前硬幣,那麽是多少?加上,如果換了當前硬幣,總值減少,此時又是多少種兌換方法? } int main() { int num=coinExchange(N, 4); cout<<num<<endl; return 0; }
ACM藍橋杯之換硬幣問題