わかりました、上記の問題を解決するために C++ プログラムを書きました。アルゴリズムは単純です:-)
まず、配列を降順で並べます (配列を降順でハードコードしましたが、任意の並べ替えアルゴリズムを適用できます)。
次に、n、pos、および sum の 3 つのスタックを取りました。最初のものは可能な合計の組み合わせが見つかる数を格納し、2 つ目は検索を開始する位置から配列のインデックスを保持し、3 つ目は要素を格納し、その加算によって入力した数が得られます。
この関数は、配列内で入力された数値以下の最大数値を探します。等しい場合は、単純にその数値を合計スタックにプッシュします。そうでない場合は、見つかった配列要素を (一時的に) 合計スタックにプッシュし、検索する数と見つかった数の差を見つけてから、再帰を実行します。
例を示しましょう:- {63,36,22,19,12,9,7,5,3,1} で 44 を検索するには
最初の 36 が sum にプッシュされます (44 未満の最大の数) 44-36=8 が n にプッシュされます (次に検索する数) 7 が合計にプッシュされます 8-7=1 が n にプッシュされます 1 がプッシュされます合計でプッシュ
したがって、44=36+7+1 :-)
#include <iostream>
#include<conio.h>
using namespace std;
int found=0;
void func(int n[],int pos[],int sum[],int arr[],int &topN,int &topP,int &topS)
{
int i=pos[topP],temp;
while(i<=9)
{
if(arr[i]<=n[topN])
{
pos[topP]=i;
topS++;
sum[topS]=arr[i];
temp=n[topN]-arr[i];
if(temp==0)
{
found=1;
break;
}
topN++;
n[topN]=temp;
temp=pos[topP]+1;
topP++;
pos[topP]=temp;
break;
}
i++;
}
if(i==10)
{
topP=topP-1;
topN=topN-1;
pos[topP]+=1;
topS=topS-1;
if(topP!=-1)
func(n,pos,sum,arr,topN,topP,topS);
}
else if(found!=1)
func(n,pos,sum,arr,topN,topP,topS);
}
main()
{
int x,n[100],pos[100],sum[100],arr[10]={63,36,22,19,12,9,7,5,3,1},topN=-1,topP=-1,topS=-1;
cout<<"Enter a number: ";
cin>>x;
topN=topN+1;
n[topN]=x;
topP=topP+1;
pos[topP]=0;
func(n,pos,sum,arr,topN,topP,topS);
if(found==0)
cout<<"Not found any combination";
else{
cout<<"\n"<<sum[0];
for(int i=1;i<=topS;i++)
cout<<" + "<<sum[i];
}
getch();
}
コードをコピーして IDE に貼り付けることができます。正常に動作します :-)