假设在n个数中选取m(0<m<=n)个数为例,可以假这个问题划分为下面两个问题:
- 从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数。
- 从n个数中选取编号更小的一个数,继续执行第一步,直到当前可选编号最大的值为m。
/// 求从数组a[1..n]中任选m个元素的所有组合。
/// a[1..n]表示候选集,m表示一个组合的元素个数。
/// b[1..M]用来存储当前组合中的元素, 常量M表示一个组合中元素的个数。
void combine( int a[], int n, int m, int b[],int M )
{
int i = 0;
for(i=n; i>=m; i--){
b[m-1] = i - 1;
if (m > 1){
combine(a,i-1,m-1,b,M);
}else{
int j=0;
for(j=M-1; j>=0; j--)
printf("%d,",a[j]);
printf("\n");
}
}
}