- bikbok
-
用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(" ");
}
}
else if(n>=0)
{
b[n]=0;
f(n+1);
b[n]=1;
f(n+1);
}
}
void main()
{
f(0);
}
- nicejikv
-
一共14个数,用排列组合,任意几个数做和,然后保存计算式子和结果比如:a+b+c=x,结果也是一共集合,然后你领导给你说,你去你保存的结果中匹配就行了,其实还是个穷举的方法
- 真颛
-
请看我的答案,这个是我自己写的。这样做可以吗??
请老师指点.
穷举法.
#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个数 ");
for(i=0;i<14;i++)
{
scanf("%d",&a[i]);
printf(" ");
}
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
}