1. 程式人生 > >ACM藍橋杯之換硬幣問題

ACM藍橋杯之換硬幣問題

代碼 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藍橋杯之換硬幣問題