2013-03-30 33 views
0

我試圖解決硬幣更換問題,它會計算可以使用的最小硬幣數量。我使用了http://www.algorithmist.com上的算法帖子。這裏的算法:Coin Change C++

C(N,m) = min(C(N,m - 1),C(N - Sm,m) + 1) 

with the base cases: 

    C(N,m) = 1,N = 0 
    C(N,m) = 0,N < 0 
    C(N, m) = 0, N >= 1, m <= 0 

但是,當我寫代碼運行到無窮大。

下面的代碼:

#include <iostream> 
#include <algorithm> 
using namespace std; 
int Types[101]; 
int Coins(int N, int m) 
{ 
    if(N==0) 
    { 
     return 1; 
    } 
    else if(N<0) 
    { 
     return 0; 
    } 
    else if(N>0 && m<=0) 
    { 
     return 0; 
    } 
    else 
    { 
     int a = Coins(N,m-1); 
     int b = Coins(N-Types[m],m) + 1; 
     int c = min(a,b); 
     return c; 
    } 
} 

int main() 
{ 
    int noOfCoins, Target; 
    cin >> noOfCoins >> Target; 
    for(int i = 0; i<noOfCoins; i++) 
    { 
     cin >> Types[i]; 
    } 
    cout << Coins(Target, noOfCoins); 
    return 0; 
} 

什麼可能是錯誤的?

+0

另請參見[上一頁stackoverflow硬幣更換問題](https://www.google.com/search?num=50&hl=zh-CN&q=site:stackoverflow.com/questions+coin+change+problem+-newest+-recently) –

回答

3

應該cout << Coins(Target, noOfCoins - 1);

,而不是cout << Coins(Target, noOfCoins);

否則,你正在訪問0元素,並再次去到相同的狀態,並再次在這裏:

int b = Coins(N-Types[m],m) + 1;

+0

很好的音符。但我不明白你的觀點,爲什麼我必須在'int b'部分進行更改,因爲如果它在遞歸中,m不能超過noOfCoins。我也發現了它在最小部分的問題。如果它返回0,那麼結果將定義爲0,所以如果a或b爲0,那麼我不包括0. – Stefan4024

+0

您應該只更改它:'cout << Coins(Target,noOfCoins - 1);'。你不必改變'int b'部分。我正在解釋'N-0 = N',你會進入相同的狀態。 –