从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?比如说1,2,3中取出两个数字,有1,21,32,3这几种情况,这用程序怎么样实现呢,数字多了之后效率会比较低,那种效率会比较好
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/19 07:37:53
![从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?比如说1,2,3中取出两个数字,有1,21,32,3这几种情况,这用程序怎么样实现呢,数字多了之后效率会比较低,那种效率会比较好](/uploads/image/z/13761494-62-4.jpg?t=%E4%BB%8En%E4%B8%AA%E6%95%B0%E4%B8%AD%E5%8F%96%E5%87%BAm%E4%B8%AA%E6%95%B0%E5%AD%97%E7%9A%84%E6%89%80%E6%9C%89%E6%83%85%E5%86%B5%2C%E7%94%A8%E4%BB%80%E4%B9%88%E7%AE%97%E6%B3%95%E8%A7%A3%E5%86%B3%2C%E5%93%AA%E7%A7%8D%E6%95%88%E7%8E%87%E6%AF%94%E8%BE%83%E9%AB%98%E5%91%A2%3F%E6%AF%94%E5%A6%82%E8%AF%B41%2C2%2C3%E4%B8%AD%E5%8F%96%E5%87%BA%E4%B8%A4%E4%B8%AA%E6%95%B0%E5%AD%97%2C%E6%9C%891%2C21%2C32%2C3%E8%BF%99%E5%87%A0%E7%A7%8D%E6%83%85%E5%86%B5%2C%E8%BF%99%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%80%8E%E4%B9%88%E6%A0%B7%E5%AE%9E%E7%8E%B0%E5%91%A2%2C%E6%95%B0%E5%AD%97%E5%A4%9A%E4%BA%86%E4%B9%8B%E5%90%8E%E6%95%88%E7%8E%87%E4%BC%9A%E6%AF%94%E8%BE%83%E4%BD%8E%2C%E9%82%A3%E7%A7%8D%E6%95%88%E7%8E%87%E4%BC%9A%E6%AF%94%E8%BE%83%E5%A5%BD)
从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