Хорошо, я написал программу на C ++ для решения вышеуказанной проблемы. Алгоритм прост: -)
Прежде всего расположите любой массив в порядке убывания (я жестко закодировал массив в порядке убывания, но вы можете применить любой из алгоритмов сортировки).
Затем я взял три стека n, pos и sum. Первый хранит номер, для которого должна быть найдена возможная комбинация сумм, второй содержит индекс массива, с которого начинается поиск, третий хранит элементы, сложение которых даст вам введенный вами номер.
Функция ищет наибольшее число в массиве, которое меньше или равно введенному числу. Если он равен, он просто помещает число в стек сумм. Если нет, то он помещает обнаруженный элемент массива в стек сумм (временно) и находит разницу между числом для поиска и встреченным числом, а затем выполняет рекурсию.
Позвольте мне показать пример: -
найти 44 в {63,36,22,19,12,9,7,5,3,1}
первые 36 будут сдвинуты в сумме (наибольшее число меньше 44)
44-36 = 8 будет нажата в n (следующий номер для поиска)
7 будет толкаться в сумме
8-7 = 1 будет толкаться в п
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, отлично работает: -)