算法说明:从n个数中选m个数,可以分解为以下两步
(1)首先从n个数中选取编号最大的数,然后在剩下的n-1个数中选取m-1个数,直到从n-(m-1)个数中选取1个数为止。
(2)从n个数中选取编号次小的一个数,继续执行第(1)步,直到当前可选编号最大的数为m。
1 #include <iostream> 2 3 using namespace std; 4 5 void Combine(int a[], int n ,int m, int b[], const int M); 6 7 int main() 8 { 9 //从N个数中选M个数,N=6,M=3 10 const int N = 6; 11 const int M = 3; 12 13 int a[N]; 14 int b[M]; //用来存储当前组合中元素(这里存储是元素下标) 15 for (int i = 0; i < N; i++) 16 a[i] = i+1; 17 18 Combine(a, N, M, b, M); 19 20 return 0; 21 } 22 23 void Combine(int a[], int n ,int m, int b[], const int M) 24 { 25 for (int i = n; i >= m; i--) 26 { 27 b[m-1] = i -1; //选取候选集a[]中最大的一个数,记录其下标 28 if (m > 1) 29 Combine(a, i-1, m-1, b, M); //从n-1中再选m-1个元素 30 else //1==m,没有元素可选,一个组合已经完成,输出 31 { 32 for (int j = M-1; j >= 0; j--) 33 cout<<a[b[j]]; 34 cout<<endl; 35 } 36 } 37 }
时间: 2024-10-12 22:59:39