如何从一些数据里知道是由哪些数据相加得出一个已知数
发布网友
发布时间:2022-04-30 20:05
我来回答
共1个回答
热心网友
时间:2022-06-30 16:21
我的思路是这样的:
问题是24个数字中的某些数字之和为某数,那么需要知道的是:1.需要其中的几个数、2.哪几个数。
由于matlab中有一些函数方便解决这个问题,所以我是用matlab算的。
程序的设计思路是:
第一层循环:从24个数里面挑选n个数,n是从1到24的整数。
(这里面有一个技巧,把这24个数从小到大排列,然后从最小的数开始一个一个往上加,可以发现加出目标数最少需要几个数;同样,从大到小一个一个加,可以发现加出目标数最多需要几个数,这样可以减少循环次数)
然后用b=combntns(a,i)函数找出在数组a中取出i个数的全部组合,求出的b是一个矩阵,每一行记录了一种i个数的组合。
第二层循环:用nchoosek(n,i)算出n个数中取i个数的组合有几种,在刚才算出的b矩阵中一行一行考察其和是否等于目标数,是则输出这一行,不是则继续扫描下一行。
如果当前的i个数的组合均不能满足要求,则将i加一,继续考察i+1个数的组合情况。
程序如下:
a=sort[]; %输入24个数,并自动从小到大排列
dest=x ; %定义目标数x
suma=[0 0]; %创建一个和向量,分别记录从小到大的和与从大到小的和
nmax=0;
nmin=0; %初始化所需数的数目的最大及最小值
for i=1:24
suma=[suma(1)+a(i) suma(2)+a(24+1-i)];
if suma(1)>=dest
nmax=i;
end
if suma(2)>=dest
nmim=i;
end
if nmax>0 && nmax>0
break
end
end
for i=nmin:nmax %把所有数字从大到小排列,发现至少要nmin个数,至多用nmax个数相加可以得到你要的数。
b=combntns(a,i); %矩阵b存储数组a中i个数的所有组合,一种组合存一行。
for j=1:nchoosek(24,i) %nchoosek(n,k)代表在n个数种取7个的组合数。
c=sum(b(j,:));
if c==dest
b(j,:) %当找到符合条件的组合时,在主界面显示。
end
end
end;
msgbox('end')来自:求助得到的回答