求一个编程答案,编程高手请进.

来源:百度知道 编辑:UC知道 时间:2024/05/31 10:18:50
目前我有一组数据如下
a= 16,129.36
b= 1,490.00
c= 116,168.54
d= 136,156.22
e= 357,254.88
f= 3,337.57
g= 300.00
h= 2,683.16
i= 144,337.00
j= 379,378.92
k= 14,679.00
l= 756,102.62
m= 15,233,840.16
n= 67,828.90

已知一个结果x= 1,397,320.30 ,这个结果是从以上数据中提取的几个数相加的结果.所以现在领导要求我编个程序,找出这几个数据.

如果我手工计算,要穷举很长时间.
请老师帮忙做个程序,最好能在SQL中实现,如果SQL中不能,也可以用其他方法.
谢谢.
3楼的老师能说具体点吗?
规划求解我不是太懂.

用EXECL的规划求解功能试试

算了,EXECL我也不熟,还是用编程来解决吧

原理很简单,这组数据有14个,我用数组a存储,再设一个长度为14的数组b,b的元素取0或1,表示对应的a中元素是否取到.这样的话,如果b[0],b[2],b[5]为1,则表示取了a中的第1,3,6个数.这时,用compute函数来计算a[0]*b[0]+a[1]*b[1]+......+a[13]*b[13],看结果是否为x即可.
因此,只要对b穷举,让其取遍0,1值即可.
另外,程序应该没问题,我选了几个数试了下,可以算出结果,但你给出的数算不出.

#include<stdio.h>
#include<math.h>

#define N 14
#define ANSWER 1397320.30

double a[N]={16129.36,1490.00,116168.54,136156.22,357254.88,3337.57,300.00,2683.16,144337.00,379378.92,14679.00,756102.62,15233840.16,67828.90};
int b[N];

bool compute()
{
double s=0;
for(int i=0;i<N;i++)
s+=a[i]*b[i];
if(fabs(s-ANSWER)<0.00001)
return true;
return false;
}

void f(int n)
{
if(n>=N)
{
if(compute())
{
for(int i=0;i<N;i++)
if(b[i])
printf("%f ",a[i]);
printf("\n");
}