私は基本的に再帰によってコインの変更の問題を解決しようとしていますが、これが私がこれまでに持っているものです-:
#include<iostream>
#include<conio.h>
using namespace std;
int a[]={1,2,5,10,20,50,100,200},count=0;
//i is the array index we are working at
//a[] contains the list of the denominations
//count keeps track of the number of possibilities
void s(int i,int sum) //the function that i wrote
{
if (!( i>7 || sum<0 || (i==7 && sum!=0) )){
if (sum==0) ++count;
s(i+1,sum);
s(i,sum-a[i]);
}
}
int c(int sum,int i ){ //the function that I took from the algorithmist
if (sum == 0)
return 1;
if (sum < 0)
return 0;
if (i <= 0 && sum > 0 )
return 1;
return (c( sum - a[i], i ) + c( sum, i - 1 ));
}
int main()
{
int a;
cin>>a;
s(0,a);
cout<<c(a,7)<<endl<<count;
getch();
return 0;
}
s(i,sum) である最初の関数は私が作成したもので、c(sum,i) である 2 番目の関数はここから取得したものです - (www.algorithmist.com/index.php/Coin_Change)。
問題は、 count が常に予想よりもはるかに高い値を返すことです。ただし、アルゴリズムのソリューションは正しい答えを返しますが、この基本ケースを理解できません
if (i <= 0 && sum > 0 ) return 1;
インデックス (i) が 0 以下で、合計がまだ 0 でない場合、関数は 1 ではなく 0 を返すべきではありませんか?
また、 Project Eulerで正しい答えが得られたため、アルゴリズムのソリューションが正しいことも知っています。