首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

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

2012-03-04 
有挑战的算法,求和的算法组合。有一组数据如下8.62.4557.252.45.5要求把上面数据相加要等于19.8的组合求出

有挑战的算法,求和的算法组合。
有一组数据如下
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

热点排行
Bad Request.