加算問題の再帰的解法に問題があります。問題は次のとおりです。与えられた m と n に対して、最小数が使用されるように n 個の数を m に合計するプログラムを作成します。ユーザーは n、m、n の数字を入力します。例: m=19 n=4 8,5,4,1 . 解は 8+5+5+1 です。配列内の次の数値で関数を呼び出し、合計よりも小さいうちに追加すると、配列内の次の数値の合計が m になる場合にのみ解が見つかります。問題が次のような場合: m=28 n=3 8,7,5 解決策は 8+8+7+5 ですが、私のプログラムは 8+8+8 になり、7 または 5 を追加しようとしてクラッシュします。それらのうち、最大 28 に収まる可能性があります。したがって、ここでの問題は、2 ステップ以上前に戻ることです。8+8+8+7 から 8+8+8 に変更できますが、8+8 に戻ることはできません。これはナップザック問題に似ていますが、より単純です。これまでに私のコードを含めて申し訳ありません:
#include <iostream>
#include <vector>
using namespace std;
void outputt(vector<int>);
int x(int m,vector<int> s,int n,int u)
{
static int sum=0;
static int level=0;
static vector<int> p;
sum+=s[u];
p.push_back(s[u]);
if(level==((n-u)+1))
{
p.pop_back();
level=0;
x(m,s,n,u-1);
}
if(sum>m)
{
level++;
sum-=s[u];
p.pop_back();
x(m,s,n,u+1);
}
if(sum==m)
{
outputt(p);
return sum;
}
else
x(m,s,n,u);
level++;
if(level>n-1)
outputt(p);
if(sum==m)
return sum;
else
{
cout<<"....";
x(m,s,n,level);
}
}
void outputt(vector<int> x)
{
for(vector<int>::iterator i=x.begin();i!=x.end();++i)
cout<<*i<<" ";
}
int main()
{
int m,n;
cin>>m>>n;
int z;
vector<int> p;
for(int i=0;i<n;++i)
{
cin>>z;
p.push_back(z);
}
cout<<x(m,p,n,0);
system("PAUSE");
}
出力に問題がありますが、それは今のところ重要ではありません。