如何在一堆数字中找出几个数,这几个数的和能够相加得一个固定值

比如说,我有24个数,我要从里面找出4个,使得这4个数的值相加等于一个固定值(这个值我自己定)如何编程?求高手!!!!!我把数字贴出来,能帮我做的就顺便啦,万分感谢!!!... 比如说,我有24个数,我要从里面找出4个,使得这4个数的值相加等于一个固定值(这个值我自己定)
如何编程?求高手!!!!!我把数字贴出来,能帮我做的就顺便啦,万分感谢!!!正确答案立马采纳!!
数值个数:25 要求找出4个,使得4个值相加等于5326.49
11.61

25.38

44.8

59.25

121.66

126.93

142.79

155.07

246.24

288.44

389.46

451.14

472.22

557.47

638.59

688.62

746.72

891.7

979.14

1028.66

1038.21

1153.38

1634.87

2760.68
展开
 我来答
社会进化论
2018-12-10 · 超过19用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:17.9万
展开全部
In[6]:= a = {1161, 2538, 4480, 5925, 12166, 12693, 14279, 15507,
24624, 28844, 38946, 45114, 47222, 55747, 63859, 68862, 74672,
89170, 97914, 102866, 103821, 115338, 163487,
276068}; mb = 487235; aa =
Table[ToExpression[StringJoin["a", ToString[i]]], {i, 1, Length[a]}];
bb = a.aa; t =
Solve[Flatten[{Total[bb] == mb, Map[{# >= 0, # <= 1} &, aa]}], aa,
Integers]; Length[t]
aa /. t
Out[7]= 16
Out[8]= {{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 1}, {0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1,
1, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0}, {0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,
1, 1, 0, 1, 0, 1, 1, 0, 0, 0}, {0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0}, {1, 0, 0, 0, 1, 0, 0, 1, 1, 1,
0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 1, 0, 0, 0,
0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0}, {1, 0, 0, 1, 1, 0,
0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0}, {1, 0, 1, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0}, {1, 0,
1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1,
0}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0,
0, 0, 0}, {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0,
0, 1, 0, 0, 0}, {1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0,
1, 1, 0, 1, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,
1, 0, 0, 0, 1, 1, 1, 0, 0}, {1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0,
0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0}, {1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0}}
用Mathematica解出来有16组解,如果是4张,那就是第一个解。运算过程中我把数据全放大了100倍,用整数来运算。
尹六六老师
2013-09-04 · 知道合伙人教育行家
尹六六老师
知道合伙人教育行家
采纳数:33774 获赞数:147228
百强高中数学竞赛教练, 大学教案评比第一名, 最受学生欢迎教

向TA提问 私信TA
展开全部
遍历即可,我用matlab编的简单程序,其他语言类似

A=[11.61,25.38,44.8,59.25, 121.66,126.93 ,142.79,155.07,246.24,288.44,389.46,451.14,472.22,557.47,638.59,688.62,746.72,891.7,979.14,1028.66,1038.21,1153.38,1634.87,2760.68];
n=length(A); %求A中元素的个数
for i=1:n-3
for j=i+1:n-2
for k=j+1:n-1
for l=k+1:n
if A(i)+A(j)+A(k)+A(l)==4872.35 %判断条件
[A(i) A(j) A(k) A(l)]
end
end
end
end
end

我这里预设的和是4872.35
程序运行的结果是44.8、1028.66、1038.21、2760.68
你要的和无解
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幽灵猎手611
2019-02-21
知道答主
回答量:19
采纳率:0%
帮助的人:1.7万
展开全部
C++版代码如下,做了一点拓展,可以求出通解
#include<iostream>
#include<cstdio>
using namespace std;
double a[1000], b[1000], c[1000];
double x ;
int n,m ;

void f(int i, int l){
if(i > n || l > m) return;
b[l] = a[i];
c[l] = i ;

if(l == m){
double sum = 0;
for(int k = 1; k <= m; k++) sum += b[k];

if(sum == x){
for(int k = 1 ; k <= m ; k++){
cout << b[k];
if(k < m) cout << " + ";
}
cout << " = " << x << endl << "这是";
for(int k = 1 ; k <= m ; k++){
cout << "第 " << c[k] << " 个数" ;
if(k < m) cout << "、";
}
cout << "相加。" << endl;
}
}

else{ for(int y = i + 1; y <= n - m + l + 1 ; y ++) f(y, l+1); }

return;
}

int main(){
cout << "请输入数字个数(完成后回车):";
cin >> n;

cout << "请输入这"<<n<<"个数,每输入一个间隔一个空格(所有数字都输入完成后回车):\n" ;
for(int i = 1; i <= n ; i++) cin >> a[i];

cout <<"请输入需要选出多少个数相加(完成后回车)\n";
cout <<"(若需要的是选出任意个数的,请输入0然后回车):\n";
cin >> m ;

cout << "请输入所需得到的固定值(完成后回车):" ;
cin >> x ;

if(m == 0){
for(m = 1; m <= n; m++){
cout << "\n选出" << m << "个数相加,所得到的组合有:\n";
for(int i = 1; i <= n-m+1; i++) f(i,1);
}
}

else{
cout << "\n选出" << m << "个数相加,所得到的组合有:\n";
for(int i = 1; i <= n-m+1; i++) f(i,1);
}

return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
L_fls
2013-09-04
知道答主
回答量:15
采纳率:0%
帮助的人:3.5万
展开全部
你要的和不存在,。java版如下:

public class test {

public static void main(String[] args) {
Double[] d={11.61,25.38,44.8,59.25,121.66,126.93,142.79,155.07,246.24,288.44,389.46,451.14,472.22,557.47,638.59,688.62,746.72 , 891.7,979.14,1028.66,1038.21,1153.38,1634.87,2760.68};

double s=0.0;
int count=0;
double a=5560.54;
for(int i=0;i<24;i++) {
for(int j=1;j<24;j++) {
for(int x=2;x<24;x++) {
for(int y=3;y<24;y++) {
s=d[i]+d[j]+d[x]+d[y];

if(s==a){

System.out.print(d[i]+",");
System.out.print(d[j]+",");
System.out.print(d[x]+",");
System.out.println(d[y]);
System.out.println("------");

}
count=count+1;

}
}
}
}
System.out.println(count);
}

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

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式