组合从N中选M
- //从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。
- //如 1 2 3 4 5 中选取 3 个
- //1、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。
- //2、如果不包含5,直接选定4,那么再在前3个里面选取2个,而前三个里面选取2个又是一个子问题,递归即可。
- //3、如果也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。
- //纵向看,1、2、3刚好是一个for循环,初值为5,终值为m
- //横向看,该问题为一个前i-1个中选m-1的递归。
1 #include <stdio.h> 2 #define N 5 3 #define M 3 4 5 int arr[N]={1,2,3,4,5}; 6 int out[M]; 7 8 void Combination(int nlen, int m) 9 { 10 if(m == 0) 11 { int j; 12 for ( j = 0; j < M; j++) 13 printf("%d ",out[j]); 14 printf("\n"); 15 return; 16 } 17 else {int i; 18 for ( i = nlen; i >= m; --i) //从后往前依次选定一个 19 { 20 out[m-1] = arr[i-1]; //选定一个后 21 Combination(i-1,m-1); // 从前i-1个里面选取m-1个进行递归 22 } 23 } 24 } 25 26 27 int main(void) 28 { 29 Combination(N,M); 30 31 return 0; 32 }