有挑战的算法,求和的算法组合。
有一组数据如下
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;
break;
}
k+=1;
for(i=0;i <a;i++)
{
x[i]=y[i];
}
}
}
这是C++代码 你修改一下
[解决办法]
代码很简单, 本来不想写的
但大过年的...
图个心情愉快吧^_^
Sub Test()
Dim i As Integer
Dim j As Integer
Dim Sum As Single
Dim N(8) As Single '保存给定的数据
Dim B(8) As Integer '二进制的权
Dim R(255) As Integer '保存结果的数组
'初始化部分
N(1) = 8.6
N(2) = 2.4
N(3) = 5
N(4) = 5
N(5) = 7.2
N(6) = 5
N(7) = 2.4
N(8) = 5.5
R(0) = 0
B(1) = 1
For i = 2 To 8
B(i) = 2 * B(i - 1)
Next
'核心部分
For i = 1 To 255
Sum = 0
For j = 1 To 8
Sum = Sum + Sgn(i And B(j)) * N(j)
Next
If Sum = 19.8 Then
R(0) = R(0) + 1
R(R(0)) = i
End If
Next
'结果展示部
For i = 1 To R(0)
Debug.Print
For j = 1 To 8
If (R(i) And B(j)) Then Debug.Print N(j);
Next
Next
End Sub
[解决办法]
偶不大喜欢指数运算
如果你不在意的话可以不用数据B
这样更简洁一些:
Sub t20070226()
Dim i As Integer
Dim j As Integer
Dim Sum As Single
Dim N(8) As Single '保存给定的数据
Dim R(255) As Integer '保存结果的数组
'初始化部分
N(0) = 8.6
N(1) = 2.4
N(2) = 5
N(3) = 5
N(4) = 7.2
N(5) = 5
N(6) = 2.4
N(7) = 5.5
R(0) = 0
'核心部分
For i = 1 To 255
Sum = 0
For j = 0 To 7
Sum = Sum + Sgn(i And 2 ^ j) * N(j)
Next
If Sum = 19.8 Then
R(0) = R(0) + 1
R(R(0)) = i
End If
Next
'结果展示部
For i = 1 To R(0)
Debug.Print
For j = 0 To 7
If (R(i) And 2 ^ j) Then Debug.Print N(j);
Next
Next
End Sub