从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?比如说1,2,3中取出两个数字,有1,21,32,3这几种情况,这用程序怎么样实现呢,数字多了之后效率会比较低,那种效率会比较好
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/25 18:07:36
从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?比如说1,2,3中取出两个数字,有1,21,32,3这几种情况,这用程序怎么样实现呢,数字多了之后效率会比较低,那种效率会比较好
从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?
比如说1,2,3中取出两个数字,有
1,2
1,3
2,3
这几种情况,这用程序怎么样实现呢,数字多了之后效率会比较低,那种效率会比较好呢
从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?比如说1,2,3中取出两个数字,有1,21,32,3这几种情况,这用程序怎么样实现呢,数字多了之后效率会比较低,那种效率会比较好
从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