2013-03-30 2 views
0

Я попытался решить проблему с изменением монеты таким образом, чтобы вычислить минимальное количество монет, которые можно использовать. Я использовал пост алгоритма на http://www.algorithmist.com. Вот алгоритм:Изменение монеты 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=ru&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 << Монеты (Target, noOfCoins - 1);'. Вам не нужно изменять часть 'int b'. Я объяснял, что «N-0 = N», и вы переходите в одно и то же состояние. –