好的,我写了一个C++程序来解决上面的问题。算法很简单:-)
首先按降序排列你拥有的任何数组(我已经以降序对数组进行了硬编码,但你可以应用任何排序算法)。
接下来我拿了三个栈 n、pos 和 sum。第一个存储要找到可能的总和组合的数字,第二个保存数组的索引,从哪里开始搜索,第三个存储元素,其相加将为您提供输入的数字。
该函数在数组中查找小于或等于输入数字的最大数字。如果相等,它只是将数字压入总和堆栈。如果不是,则将遇到的数组元素(临时)推送到和堆栈,并找到要搜索的数字与遇到的数字之间的差异,然后执行递归。
让我举个例子:- 在 {63,36,22,19,12,9,7,5,3,1} 中找到 44
前 36 将被推入总和(小于 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 中,工作正常 :-)