Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 513|回复: 0

[算法学习]组合算法的巧妙实现

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-26 00:06:06 | 显示全部楼层 |阅读模式
    1. import java.util.ArrayList;
    2. import java.util.List;
    3. /**
    4. *
    5. *  
    6. * @author wangmingjie
    7. * @date 2009-1-1下午01:22:19
    8. */
    9. public class Test{
    10. //  组合算法   
    11. //    本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标   
    12. //    代表的数被选中,为0则没选中。      
    13. //    首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。      
    14. //    然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为   
    15. //    “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。      
    16. //    当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得   
    17. //    到了最后一个组合。      
    18. //    例如求5中选3的组合:      
    19. //    1   1   1   0   0   //1,2,3      
    20. //    1   1   0   1   0   //1,2,4      
    21. //    1   0   1   1   0   //1,3,4      
    22. //    0   1   1   1   0   //2,3,4      
    23. //    1   1   0   0   1   //1,2,5      
    24. //    1   0   1   0   1   //1,3,5      
    25. //    0   1   1   0   1   //2,3,5      
    26. //    1   0   0   1   1   //1,4,5      
    27. //    0   1   0   1   1   //2,4,5      
    28. //    0   0   1   1   1   //3,4,5   
    29.     public static void main(String[] args) {
    30.         Test  s = new Test();
    31.         s.printAnyThree();      
    32.     }
    33.      
    34.     /**
    35.      *  
    36.      */
    37.     public void printAnyThree(){
    38.         int[] num = new int[]{1,2,3,4,5};
    39.         print(combine(num,3));
    40.     }
    41.     /**
    42.      * 从n个数字中选择m个数字
    43.      * @param a
    44.      * @param m
    45.      * @return
    46.      */
    47.     public List combine(int[] a,int m){
    48.         int n = a.length;
    49.         if(m>n){
    50.            System.out.println("错误!数组a中只有"+n+"个元素。");
    51.            System.exit(0);
    52.         }
    53.          
    54.         List result = new ArrayList();
    55.          
    56.         int[] bs = new int[n];
    57.         for(int i=0;i< n;i++){
    58.             bs[i]=0;
    59.         }
    60.         //初始化
    61.         for(int i=0;i< m;i++){
    62.             bs[i]=1;
    63.         }
    64.         boolean flag = true;
    65.         boolean tempFlag = false;
    66.         int pos = 0;
    67.         int sum = 0;
    68.         //首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
    69.         do{
    70.             sum = 0;
    71.             pos = 0;
    72.             tempFlag = true;  
    73.             result.add(print(bs,a,m));
    74.             
    75.             for(int i=0;i< n-1;i++){
    76.                 if(bs[i]==1 && bs[i+1]==0 ){
    77.                     bs[i]=0;
    78.                     bs[i+1]=1;
    79.                     pos = i;
    80.                     break;
    81.                 }
    82.             }
    83.             //将左边的1全部移动到数组的最左边
    84.             
    85.             for(int i=0;i< pos;i++){
    86.                 if(bs[i]==1){
    87.                     sum++;
    88.                 }
    89.             }
    90.             for(int i=0;i< pos;i++){
    91.                 if(i< sum){
    92.                     bs[i]=1;
    93.                 }else{
    94.                     bs[i]=0;
    95.                 }
    96.             }
    97.             
    98.             //检查是否所有的1都移动到了最右边
    99.             for(int i= n-m;i< n;i++){
    100.                 if(bs[i]==0){
    101.                     tempFlag = false;
    102.                     break;
    103.                 }
    104.             }
    105.             if(tempFlag==false){
    106.                 flag = true;
    107.             }else{
    108.                 flag = false;
    109.             }
    110.             
    111.         }while(flag);
    112.         result.add(print(bs,a,m));
    113.          
    114.         return result;
    115.     }
    116.      
    117.     private int[] print(int[] bs,int[] a,int m){
    118.         int[] result = new int[m];
    119.         int pos= 0;
    120.         for(int i=0;i< bs.length;i++){
    121.             if(bs[i]==1){
    122.                 result[pos]=a[i];
    123.                 pos++;
    124.             }
    125.         }
    126.         return result ;
    127.     }
    128.      
    129.     private void print(List l){
    130.         for(int i=0;i< l.size();i++){
    131.             int[] a = (int[])l.get(i);
    132.             for(int j=0;j< a.length;j++){
    133.                 System.out.print(a[j]+"        ");
    134.             }
    135.             System.out.println();
    136.         }
    137.     }
    138. }
    139. 运行:
    140.                      
    复制代码
    C:java>java Test
    1 2 3
    1 2 4
    1 3 4
    2 3 4
    1 2 5
    1 3 5
    2 3 5
    1 4 5
    2 4 5
    3 4 5
       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/26/000606609.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-5-11 06:44 , Processed in 0.311793 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表