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

目前我有一组数据如下a=16,129.36b=1,490.00c=116,168.54d=136,156.22e=357,254.88f=3,337.57g=300.00... 目前我有一组数据如下
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楼的老师能说具体点吗?
规划求解我不是太懂.
展开
 我来答
忘至白葬不情必0T
2008-07-31 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:90%
帮助的人:1.2亿
展开全部
用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");
}
}
else if(n>=0)
{
b[n]=0;
f(n+1);
b[n]=1;
f(n+1);
}
}

void main()
{
f(0);
}
loveandkissyou
2008-07-30 · TA获得超过2297个赞
知道大有可为答主
回答量:2332
采纳率:0%
帮助的人:2507万
展开全部
一共14个数,用排列组合,任意几个数做和,然后保存计算式子和结果比如:a+b+c=x,结果也是一共集合,然后你领导给你说,你去你保存的结果中匹配就行了,其实还是个穷举的方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
heping121
2008-07-30
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
请看我的答案,这个是我自己写的。这样做可以吗??
请老师指点.
穷举法.

#include<stdio.h>
void main()
{
float a[14];
int rusult;
int i,j,k,l,m,n,s,t,u,v;
float result;
printf("请输入这14个数\n");
for(i=0;i<14;i++)
{
scanf("%d",&a[i]);
printf("\n");
}
i=0;
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
result=a[i]+a[j];
if(result==1,397,320.30 )
printf(%d,%d,'a[i]','a[j]')
}
}
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
for(k=j+1;k<14;k++)
{
result=a[i]+a[j]+a[k];
if(result==1,397,320.30 )
printf(%d,%d,%d,'a[i]','a[j]','a[k]');
}
}
}
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
for(k=j+1;k<14;k++)
{
for(l=k+1;l<14;l++)
{
result=a[i]+a[j]+a[k]+a[l];
if(result==1,397,320.30 )
printf(%d,%d,%d,%d,'a[i]','a[j]','a[k]','a[l]');
}
}
}
}
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
for(k=j+1;k<14;k++)
{
for(l=k+1;l<14;l++)
{
for(m=l+1;m<14;m++)
{
result=a[i]+a[j]+a[k]+a[l]+a[m];
if(result==1,397,320.30 )
printf(%d,%d,%d,%d,%d,'a[i]','a[j]','a[k]','a[l]','a[m]');
}
}
}
}
}
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
for(k=j+1;k<14;k++)
{
for(l=k+1;l<14;l++)
{
for(m=l+1;m<14;m++)
{
for(n=m+1;n<14;n++)
{
result=a[i]+a[j]+a[k]+a[l]+a[m]+a[n];
if(result==1,397,320.30 )
printf(%d,%d,%d,%d,%d,%d,'a[i]','a[j]','a[k]','a[l]','a[m]',a[n]);
}
}
}
}
}
}
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
for(k=j+1;k<14;k++)
{
for(l=k+1;l<14;l++)
{
for(m=l+1;m<14;m++)
{
for(n=m+1;n<14;n++)
{
for(s=n+1;s<14;s++)
{
result=a[i]+a[j]+a[k]+a[l]+a[m]+a[n]+a[s];
if(result==1,397,320.30 )
printf(%d,%d,%d,%d,%d,%d,%d,'a[i]','a[j]','a[k]','a[l]','a[m]','a[n]','a[s]');
}
}
}
}
}
}
}
for(i=0;i<14;i++)
{
for(j=i+1;j<14;j++)
{
for(k=j+1;k<14;k++)
{
for(l=k+1;l<14;l++)
{
for(m=l+1;m<14;m++)
{
for(n=m+1;n<14;n++)
{
for(s=n+1;s<14;s++)
{
for(t=s+1;t<14;t++)
{
result=a[i]+a[j]+a[k]+a[l]+a[m]+a[n]+a[s]+a[t];
if(result==1,397,320.30 )
printf(%d,%d,%d,%d,%d,%d,%d,%d,'a[i]','a[j]','a[k]','a[l]','a[m]','a[n]','a[s]','a[t]');
}
}
}
}
}
}
}
}

end
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式