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入门到精通教程
查看: 594|回复: 0

组合算法的巧妙实现 java实例

[复制链接]

该用户从未签到

发表于 2011-9-18 16:35:19 | 显示全部楼层 |阅读模式
import java.util.ArrayList;
import java.util.List;
/**
*
*  
* @author wangmingjie
* @date 2009-1-1下午01:22:19
*/
public class Test{
//  组合算法   
//    本程序的思路是开一个数组,其下标表示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   
    public static void main(String[] args) {
        Test  s = new Test();
        s.printAnyThree();      
    }
     
    /**
     *  
     */
    public void printAnyThree(){
        int[] num = new int[]{1,2,3,4,5};
        print(combine(num,3));
    }
    /**
     * 从n个数字中选择m个数字
     * @param a
     * @param m
     * @return
     */
    public List combine(int[] a,int m){
        int n = a.length;
        if(m>n){
           System.out.println("错误!数组a中只有"+n+"个元素。");
           System.exit(0);
        }
         
        List result = new ArrayList();
         
        int[] bs = new int[n];
        for(int i=0;i< n;i++){
            bs=0;
        }
        //初始化
        for(int i=0;i< m;i++){
            bs=1;
        }
        boolean flag = true;
        boolean tempFlag = false;
        int pos = 0;
        int sum = 0;
        //首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
        do{
            sum = 0;
            pos = 0;
            tempFlag = true;  
            result.add(print(bs,a,m));
            
            for(int i=0;i< n-1;i++){
                if(bs==1 && bs[i+1]==0 ){
                    bs=0;
                    bs[i+1]=1;
                    pos = i;
                    break;
                }
            }
            //将左边的1全部移动到数组的最左边
            
            for(int i=0;i< pos;i++){
                if(bs==1){
                    sum++;
                }
            }
            for(int i=0;i< pos;i++){
                if(i< sum){
                    bs=1;
                }else{
                    bs=0;
                }
            }
            
            //检查是否所有的1都移动到了最右边
            for(int i= n-m;i< n;i++){
                if(bs==0){
                    tempFlag = false;
                    break;
                }
            }
            if(tempFlag==false){
                flag = true;
            }else{
                flag = false;
            }
            
        }while(flag);
        result.add(print(bs,a,m));
         
        return result;
    }
     
    private int[] print(int[] bs,int[] a,int m){
        int[] result = new int[m];
        int pos= 0;
        for(int i=0;i< bs.length;i++){
            if(bs==1){
                result[pos]=a;
                pos++;
            }
        }
        return result ;
    }
     
    private void print(List l){
        for(int i=0;i< l.size();i++){
            int[] a = (int[])l.get(i);
            for(int j=0;j< a.length;j++){
                System.out.print(a[j]+"\t");
            }
            System.out.println();
        }
    }
} 运行:
                     
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
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 19:41 , Processed in 0.372521 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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