`
xieyan30
  • 浏览: 49095 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

java组合的算法

 
阅读更多

从m个数里面取n个数的算法:

这里只说一种.网上也有例子.

题目:

1到19取任意个数字,求和为20的组合.

 

算法分析:

1,定义两个数组,一个存放真实的值--(arrVal),一个存放每个值对应的flag--(arrFlag);

    (这里也可以用一个数组,可以用arrFlag数组下标代替1到19,有无缺点自己可以去衡量下,主要看自己的需求。)

2,arrFlag(存放flag的数组),值为0代表arrVal数组对应下标的值没有被选中,反之,值为1被选中。

3,初期化,将arrFlag数组的前n个值设置为1,代表第一个组合。

4,从左到右开始扫描arrFlag数组,将第一个“10”组合转为“01”组合,并且将其左边的1全部移动到数组的最左端,这样改变后算一组组合。

     示例:    011100 ⇒ 011010(先将“10”变为“01”) ⇒110010(再将“1”全部移动到数组的最左端)

5,当数组没有“10”组合时,也就是说n个1全部移动到最右端时,遍历结束。

     示例:    000111表示遍历结束

 

程序解析:

1,定义两个数组,一个存放真实的值--(arrVal),一个存放每个值对应的flag--(arrFlag);

(这里也可以用一个数组,可以用arrFlag数组下标代替1到19,有无缺点自己可以去衡量下,主要看自己的需求。)

可以参照这个对照程序看.

    /** 常量定义 */
	// 和为20
    private static final int SUM = 20;
    // 数组长度 = 19
    private static final int ARR_LENGTH = 19;
    // 存放真实值的数组
    private static final int[] arrVal = new int[ARR_LENGTH];
    // 存放标记的数组
    private static int[] arrFlag = new int[ARR_LENGTH];
    // 存放真实值的数组初期化
    static {
        for (int i = 0; i < ARR_LENGTH; i++) {
            arrVal[i] = i + 1;
        }
    }

 2,程序的入口方法main()

     求和至少2个数,最多ARR_LENGTH个数

 

    public static void main(String[] args) {
        for (int i = 2; i <= ARR_LENGTH; i++) {
            assemble(i);
        }
    }
 3,组合的方法
    /**
     * 组合.
     * 
     * @param num 组合的个数
     */
    private static void assemble(int num) {
        // 初期化flag数组,将arrFlag数组的前n个值设置为1,代表第一个组合。
        initArrFlag(num);

        // 判断第一组组合是否满足需求
        if (isRequired()) {
            print();
        }

        // 遍历结束flag(true:结束,false:未结束)
        boolean endFlag = false;
        while (!endFlag) {
            // 第一次出现"10"的位置左端出现1的个数
            int sumOne = 0;

            for (int i = 0; i < ARR_LENGTH - 1; i++) {
                if(arrFlag[i] == 1) {
                    sumOne++;
                }

                // 找出第一次出现"10"的位置
                if (arrFlag[i] == 1 && arrFlag[i + 1] == 0) {
                    // 将"10"改变为"01"
                    arrFlag[i] = 0;
                    arrFlag[i + 1] = 1;

                    // 将该位置左侧的1全部移动到最左端
                    for(int j = 0; j < i; j++) {
                        if(j < sumOne - 1) { // 注意:此处要-1,因为包含了"10"的这个1
                            arrFlag[j] = 1;
                        } else {
                            arrFlag[j] = 0;
                        }
                    }
                    endFlag = false;
                    break;
                }

                endFlag = true;
            }

            // 判断新组合是否满足需求
            if (isRequired()) {
                print();
            }
        }
    }
 4,下面是一些辅助方法。

 

    /**
     * 初期化flag数组,将arrFlag数组的前n个值设置为1。
     * 
     * @param num 组合的个数
     */
    private static void initArrFlag(int num) {
        for (int i = 0; i < ARR_LENGTH; i++) {
            if(i < num) {
                arrFlag[i] = 1;
            } else {
                arrFlag[i] = 0;
            }
        }
    }

    /**
     * 判断组合是否满足需求。
     * 
     * @return true:满足, false:不满足
     */
    private static boolean isRequired() {
        int sum = 0;
        for (int i = 0; i < ARR_LENGTH; i++) {
            if (arrFlag[i] == 1) {
                sum += arrVal[i];
            }
        }

        if (sum == SUM) {
            return true;
        }
        return false;
    }

    /**
     * 输出组合。
     */
    private static void print() {
        System.out.println();
        for (int i = 0; i < ARR_LENGTH; i++) {
            if (arrFlag[i] == 1) {
                System.out.print(arrVal[i] + ", ");
            }
        }
    }
 
  • A1.rar (1.1 KB)
  • 下载次数: 2
分享到:
评论

相关推荐

    java组合算法

    ### Java组合算法详解 在Java编程语言中,组合算法是一种常用的数据处理方法,尤其是在需要从一组数据中选取特定数量元素的场景下。本篇文章将基于提供的代码片段来深入探讨组合算法的基本原理、实现方式以及其背后...

    经典java组合算法源码--TryCombination(算法源码)

    System.out.println("对整数数组进行组合:C(n,n)"); int[] intArray=new int[4]; for(int i=0;i;i++){ intArray[i]=i+1; } System.out.println("对整数数组进行组合:C(4,4)"); Combination ...

    1204 Java 遗传算法排课java sqlserver.rar_java排课算法_排课_排课系统java_遗传算法Java

    Java遗传算法排课系统是一种利用遗传算法解决复杂优化问题的软件应用。在教育领域,排课是一个典型的组合优化问题,需要考虑多方面的约束条件,如教师时间冲突、教室容量限制、课程时间安排等。遗传算法作为一种启发...

    Java排列组合算法 - 郭睿的专栏 - CSDN博客

    Java排列组合算法 - 郭睿的专栏 - CSDN博客Java排列组合算法 - 郭睿的专栏 - CSDN博客

    Java排列组合算法分析和代码实现

    总之,这个资源包提供了一个很好的平台,让你能够深入理解并实践Java中的排列组合算法。通过学习和理解这些代码,你不仅可以增强算法设计能力,还能提高解决实际编程问题的能力。记得动手实践,结合文档和代码,将...

    java排列组合算法

    在Java中实现排列组合算法可以帮助我们解决很多实际问题,比如数据排序、数据筛选等。下面将详细介绍排列和组合的基本概念以及在Java中的实现方法。 **排列** 是指从n个不同元素中取出m(m≤n)个元素,按照一定的...

    Java排列组合_组合算法

    在Java中实现组合算法,通常会用到递归方法。递归是一种解决问题的方法,它将问题分解为更小的子问题,直到子问题可以直接求解。在组合问题中,递归的思想是:每次选择一个元素加入组合,然后对剩余的元素继续进行...

    Java排列组合算法

    本文将深入探讨Java中实现排列组合算法的方法,帮助开发者更好地理解和运用这些概念。 排列是有序的选择,而组合是无序的选择。在Java中,我们可以使用递归、回溯法或者迭代的方式来实现这两种算法。下面我们将详细...

    gray码生成组合算法的java代码

    本项目"gray码生成组合算法的java代码"是基于Java编程语言实现的,旨在结合组合数学原理生成Gray码。在实际编程中,生成Gray码通常涉及到循环移位和异或操作。下面将详细讲解这个程序可能涉及的知识点: 1. **Java...

    Java麻将算法汇总(胡牌算法、AI算法、查胡算法、评估算法、出牌算法)majiang_algorithm-master.zip

    在Java编程领域,麻将算法是游戏开发中的一个重要组成部分,尤其对于设计复杂的AI系统而言。本压缩包"majiang_algorithm-master.zip"包含了一系列与麻将相关的算法实现,如胡牌算法、AI算法、查胡算法、评估算法和出...

    实现了排列组合算法的类(JAVA).rar

    这个"实现了排列组合算法的类(JAVA).rar"文件提供了一种高效的JAVA实现,可以处理任意类型数组的排列和组合。下面将详细讨论排列组合的基本概念,以及在JAVA中实现这些算法的关键点。 排列是指从n个不同元素中...

    6位数,共有几种排列组合的算法java实现

    6位数,共有几种排列组合的算法,java实现

    Java递归算法构造JSON树形结构

    Java 递归算法构造 JSON 树形结构 Java 递归算法构造 JSON 树形结构是指通过 Java 语言使用递归算法将数据库中的菜单表构建成树形的 JSON 格式发送给第三方。这种方法可以将复杂的树形结构数据转换成易于理解和处理...

    Java常用算法手册

    《Java常用算法手册》是一本专注于Java编程语言的算法学习资源,由中国铁道出版社出版,提供了全书的源代码,旨在帮助读者深入理解和掌握各种算法,提升编程技能。这本书不仅覆盖了基础的算法理论,还提供了丰富的...

    《Java常用算法手册》源代码

    《Java常用算法手册》源代码是一份非常宝贵的资源,它为Java开发者提供了丰富的算法实现,是学习和实践算法的理想材料。这份源代码集合涵盖了多种经典和实用的算法,旨在帮助开发者提升编程技能,理解算法原理,并能...

    Java经典算法(包你们划算)

    Java作为一门广泛应用于企业级开发和互联网应用的语言,其经典算法是每个Java程序员必备的技能之一。本资源包“Java经典算法(包你们划算)”提供了丰富的学习材料,旨在帮助开发者提升算法理解和应用能力。主要包含...

    JAVA遗传算法编程pdf版本书籍

    遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化论中的自然选择和遗传原理的优化方法,它在解决复杂问题,尤其是组合优化问题上表现出强大的能力。以下是对该书可能涵盖的知识点的详细解析: 一、遗传...

    Java经典算法源码实例(Java算法,源码)

    这个名为“Java经典算法源码实例”的资源集合提供了一系列用Java语言实现的常见算法,对于深入理解算法原理、提高编程技能以及优化代码性能具有极大的帮助。下面,我们将详细探讨这些算法及其应用。 1. **排序算法*...

    排列组合算法实现

    排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。

Global site tag (gtag.js) - Google Analytics