组合从N中选M

  1. //从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。 
  2. //如 1 2 3 4 5 中选取 3 个 
  3. //1、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。 
  4. //2、如果不包含5,直接选定4,那么再在前3个里面选取2个,而前三个里面选取2个又是一个子问题,递归即可。 
  5. //3、如果也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。 
  6. //纵向看,1、2、3刚好是一个for循环,初值为5,终值为m 
  7. //横向看,该问题为一个前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 }

 

posted @ 2014-03-19 14:43  義丨往昔灬miller  阅读(216)  评论(0编辑  收藏  举报