分享

输出从m个数中的任意抽取n个数的组合全部可能序列

 博雅书屋lhs 2013-11-13

     (1)  初始化一个m个元素的数组(全部由0,1组成),将前n个初始化为1,后面的为0。这时候就可以输出第一个组合序列了。

     (2)  从前往后找,找到第一个10组合,将其反转成01,然后将这个10组合前面的所有1,全部往左边推 ,即保证其前面的1都在最左边。这时又可以输出一组组合序列了。

     (3)  重复第(2)步,知道找不到10组合位置。这时已经输出了全部的可能序列了。 为什么?你想,(以m=5,n=3为例)一开始是11100,最后就是00111,已经没有10组合了

 

 

  1. //10置换法源代码   
  2. public void combination(int m,int n)   
  3. {   
  4.     char[] totalArray=new char[m];     
  5.     //记录排序次数   
  6.     int totalSortNum=0;   
  7.            
  8.     //建立 111...100...0   
  9.     for(int i=0;i<m;i++){   
  10.         if(i<n)   
  11.             totalArray[i]='1';   
  12.         else  
  13.             totalArray[i]='0';   
  14.     }   
  15.     totalSortNum+=1;   
  16.        System.out.println(totalSortNum+"/t"+Arrays.toString(totalArray));   
  17.            
  18.     //"10"反转置换法   
  19.     int index=-1;   
  20.     while((index=String.valueOf(totalArray).indexOf("10"))!=-1){   
  21.         //交换"10"为"01"   
  22.         totalArray[index]='0';   
  23.         totalArray[index+1]='1';   
  24.         //计算刚反转的"10"前面所有的'1'全部移动到最左边   
  25.         int count=0;       
  26.         for(int i=0;i<index;i++){   
  27.             if(totalArray[i]=='1')   
  28.                 count++;   
  29.         }   
  30.         for(int j=0;j<index;j++){   
  31.             if(j<count)   
  32.                 totalArray[j]='1';   
  33.             else totalArray[j]='0';   
  34.         }   
  35.         //输出结果   
  36.         totalSortNum++;   
  37.                System.out.println(totalSortNum+"/t"+Arrays.toString(totalArray));   
  38.     }   
  39. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多