从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢

如题所述

第1个回答  2019-05-13
从n中选m个数,以下两种方法:
(1)递归
a.
首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止。
b.
从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m。
下面是递归方法的实现:
///
求从数组a[1..n]中任选m个元素的所有组合。
///
a[1..n]表示候选集,n为候选集大小,n>=m>0。
///
b[1..M]用来存储当前组合中的元素(这里存储的是元素下标),
///
常量M表示满足条件的一个组合中元素的个数,M=m,这两个参数仅用来输出结果。
void
combine(
int
a[],
int
n,
int
m,
int
b[],
const
int
M
)
{
for(int
i=n;
i>=m;
i--)
//
注意这里的循环范围
{
b[m-1]
=
i
-
1;
if
(m
>
1)
combine(a,i-1,m-1,b,M);
else
//
m
==
1,
输出一个组合
{
for(int
j=M-1;
j>=0;
j--)
cout
<<
a[b[j]]
<<
"
";
cout
<<
endl;
}
}
}
(2)01转换法
本程序的思路是开一个数组,其下标表示1到n个数,数组元素的值为1表示其代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的n-m的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
例如求5中选3的组合:
1
1
1
0
0
//1,2,3
1
1
0
1
0
//1,2,4
1
0
1
1
0
//1,3,4
0
1
1
1
0
//2,3,4
1
1
0
0
1
//1,2,5
1
0
1
0
1
//1,3,5
0
1
1
0
1
//2,3,5
1
0
0
1
1
//1,4,5
0
1
0
1
1
//2,4,5
0
0
1
1
1
//3,4,5

从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?
(2)01转换法 本程序的思路是开一个数组,其下标表示1到n个数,数组元素的值为1表示其代表的数被选中,为0则没选中。首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1...

从n个数中选出m个数有几种组合
从n个数中挑选m个数的组合方式共有C(n,m)种。这一数量可以通过组合数学来计算,它描述了从n个不同元素中无重复地选取m个元素的所有可能方式。组合数学是数学的一个重要分支,专门研究离散且有限的对象的组合结构和属性。这一领域的重要性在于其广泛的实用性,涵盖了密码学、统计学、计算机科学、化学...

数学的排列组合算法加公式
。n,n个数中,取m个组合(可重复) n^m 追问: c(n,m),读作什么?把1-6取4位带进去怎么算,可以教我吗?50分感激不尽 回答: 这个是组合数 从n个元素里面取m个元素的组合数 比如c(6,4)=(6*5*4*3)\/(1*2*3*4) c(n,m)=[n*(n-1)*...*(n-m+1)]...

从n个数中取出m个最大的最好的算法是什么?
1. n×m遍扫描 【算法基本描述】n×m遍扫描 【算法思想】每次都扫描一遍数组,取出最大元素,这样扫描m遍就能得到m个最大的数 【算法复杂度】O(nm)2.排序后取最大m个数 【算法基本描述】对n个数排序,对拍完序后的序列取m个最大的数 【算法复杂度】视排序的复杂度,一般为O(nlogn)或O(n...

c#求一个高效的组合算法,N个数选M个数的组合
楼上真是认知短浅。就用二分递归法,辅以记忆法优化,去除重复计算的过程,可以做到时间复杂度为O(n^2),计算C(50,22)就要 0.005秒 自己写的代码,计算C(n,m):static __int64 table[100][100]={{0,0}};__int64 combination(int n,int m){ if(table[n][m]!=0)return table[n...

Pascal算法之回溯及递推详细介绍、
回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为: 一、定义一个解空间,它包含问题的解。 二、利用适于搜索的方法组织解空间。 三、利用深度优先法搜索解空间。 四、利用限界函数...

有N个数据,其中有m个数的和等于A,在excel中如何用公式或程序解决?
这个应该是个算法题了。应该使用vba。 在给定的N个数字中,相加得到A的m个数,可能答案不是一组。要进行遍历。如果使用穷举法,那么要进行N个数中取m个数的遍历,算法的复杂度就是n的2次方。但是要先对N个数进行排序。之后进行贪心算法,复杂度会降很多。

C语言编程实现:从N位数字串中删掉M个数使剩下的数字串所表示的数值最...
算法:例如五位数去除两个数,先比较前三(5-2)位数的大小,若第三个数最小,去掉前两位数即可。若第二个数最小,去掉前一位数,比较其后两位数大小,若第二个数最小,去掉第一位数,反之,去掉第一位数。若第一个数最小,考虑其后三位数的大小,若第三个数最小,去掉其前两位数即可。若第二...

...每堆至少一个。问有多少种分法,求高效率的算法。
在n个物体中,先选出m个物体,每一堆放一个,这样有A(m)(n)=n*(n-1)*...*(n-m+1)种情况,然后其余的物品随便放,有m^(n-m)种情况,两者相乘就是答案

数学排列组合公式算法
解释如下:排列的计算公式:排列是从n个不同元素中取出m个元素进行排序。比如从1到5这五个数中取出三个数进行排序,其排列数为P₅₃,表示从5个数中取3个数的所有可能的排序方式。计算时,从第一个数开始,它可以是任意数,因此有5种选择;第二个数在剩下的数中选择,有4种选择;...

相似回答
大家正在搜