正文

组合--非递归实现2008-04-01 23:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xboy/33815.html

分享到:

组合算法 (来源与互联网)    本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。  首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。     然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。       当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。  例如求5中选3的组合:       1   1   1   0   0   //1,2,3  1   1   0   1   0   //1,2,4  1   0   1   1   0   //1,3,4  0   1   1   1   0   //2,3,4  1   1   0   0   1   //1,2,5  1   0   1   0   1   //1,3,5  0   1   1   0   1   //2,3,5  1   0   0   1   1   //1,4,5  0   1   0   1   1   //2,4,5  0   0   1   1   1   //3,4,5 以下是实现: #include<stdio.h> #define MAXNUM 50 void init(int* pac, int n, int m);void convert10To01(int* pac, int n, int m); int main(){ int i, count = 1; int n, m; int pac[MAXNUM];  printf("please input two numbers(e.g.:5 3)\n"); scanf("%d %d", &n, &m); printf("\n----------result-------------\n");  init(pac, n, m); while(!end(pac, n, m)){  convert10To01(pac, n, m);  count++;   for(i=0; i<n; i++){   if(1 == pac[i])    printf("%d ", i+1);  }  printf("\n"); }  printf("total: %d\n", count); return 0;} void init(int* pac, int n, int m){ int i, j;  for(i=0; i<n; i++){  if(i < m)   pac[i] = 1;  else    pac[i] = 0; }  for(i=0; i<n; i++){  if(1 == pac[i])   printf("%d ", i+1); } printf("\n");} int end(int* pac, int n, int m){ int i, j;  for(i=n-m; i<n; ++i)  if(pac[i] == 0) break;  if(i >= n) return 1; else return 0;} void convert10To01(int* pac, int n, int m){ int i, j; int count=0;  for(i=0; i<n; i++){    if(1 == pac[i] && 0 == pac[i+1]){   pac[i] = 0;   pac[i+1] = 1;   break;  }  if(1 == pac[i]) ++count; }  for(j=0; j<i; j++){     if(j < count)    pac[j] = 1;   else    pac[j] = 0; }}

阅读(2764) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册