有挑战的算法,求和的算法组合。该如何解决

有挑战的算法,求和的算法组合。
有一组数据如下
8.6     2.4     5     5     7.2     5     2.4     5.5

要求把上面数据相加要等于19.8的组合求出来。

上面数据相加=19.8的组和有
2.4+5+5+5+2.4=19.8

要最快的算法求出组合来,并显示由哪几个数字组合而成。

把代码写出来。
谢谢!

------解决方案--------------------
使用 迭代法
我是引用原著者的答案,程式最终解释权请查看参考资料

#include <iostream>
#include <cmath>
using namespace std;
int a,b,m;
double *x0;
void Jacobi(double **c,double *d,int n,double eps);
void Gauss(double **c,double *d,int n,double eps);
void main()
{
int n;
double **A,*B;
double e;
cout < < "请选择求方程组的迭代方法!雅可比选0,高斯-赛德尔选1! " < <endl;
cin> > n;
cout < < "输入方程组的变量的个数以及方程的个数! " < <endl;
cin> > a> > b;
A=new double*[b];
for(int i=0;i <b;i++)
{
A[i]=new double[a];
}
B=new double[b];
x0=new double[a];
cout < < "输入每个方程组的变量的系数以及方程右端的值! " < <endl;
for(int k=0;k <b;k++)
{
for(int j=0;j <a;j++)
{
cin> > A[k][j];
cout < < "A[ " < <k < <j < < "]= " < <A[k][j] < <endl;
}
cin> > B[k];
cout < < "B[ " < <k < < "]= " < <B[k] < <endl;
}
cout < < "输入方程组迭代的次数及所要求的精度! " < <endl;
cin> > m> > e;
cout < < "输入方程组迭代的初值! " < <endl;
for(int j=0;j <a;j++)
{
cin> > x0[j];
}
switch (n)
{
case 0:Jacobi(A,B,m,e);
break;
case 1:Gauss(A,B,m,e);
break;
default:cout < < "你没有选择求解方程组的一种方法!! " < <endl;
break;
}
}

void Jacobi(double **c,double *d,int n,double eps)
{
int k,i;
double *y = new double[a],*x=new double[a],s,temp=0.0;
k=1;
while(1)
{
temp = 0.0;
for(i=0;i <a;i++)
{
s=0.0;
for(int j=0;j <a;j++)
{
if(j!=i)
{
s+=c[i][j]*x0[j];
}
}
s=(d[i]-s)/c[i][i];
y[i]=s;
if(fabs(x0[i]-s)> temp)
{
temp=fabs(x0[i]-s);
}
}
if(temp <eps)
{
cout < < "迭代成功!迭代结果为: " < <endl;
for(i=0;i <a;i++)
{
cout < < "y[ " < <i < < "] = " < <y[i] < <endl;
}
break;
}
if(k==m)
{
cout < < "迭代失败!! " < <endl;
break;
}
k+=1;
for(i=0;i <a;i++)
{
x0[i]=y[i];
}
}
}
void Gauss(double **c,double *d,int n,double eps)
{
int k,i;
double *y=new double[a],*x=new double[a],s,temp=0.0;
for(i=0;i <a;i++)
{
x[i]=x0[i];
y[i]=x[i];
}
k=1;
while(1)
{
temp=0.0;
for(i=0;i <a;i++)
{
s=0.0;
for(int j=0;j <a;j++)
{
if(j!=i)
{
s+=c[i][j]*y[j];
}
}
s=(d[i]-s)/c[i][i];
y[i]=s;
if(fabs(x[i]-s)> temp)
{
temp=fabs(x[i]-s);
}
}
if(temp <eps)
{
cout < < "迭代成功!迭代结果为: " < <endl;
for(i=0;i <a;i++)
{
cout < < "y[ " < <i < < "] = " < <y[i] < <endl;
}
break;
}
if(k==m)
{
cout < < "迭代失败!! " < <endl;