【基本算法】穷举算法

1、什么是穷举?

穷举算法是最简单的一种算法,其依赖于计算机的强大计算能力,来穷尽每一种可能的情况,从而达到求解问题的目的。

穷举算法效率并不高,但适用于一些没有明显规律可循的场景。基本思想是从所有可能的情况中搜索正确的答案,在使用穷举算法时,需要明确问题的答案的范围,这样才可以在指定范围内搜索答案。指定范围之后,就可以使用循环语句和条件判断语句逐步验证候选答案的正确性,从而得到需要的正确答案。其执行步骤如下:

(1). 对于一种可能的情况,计算其结果;

(2). 判断结果是否满足要求,如果不满足则执行第(1)步来搜索下一个可能的情况;如果满足要求,则表示寻找到一个正确的答案。

2、穷举算法应用

鸡兔同笼

鸡兔同笼问题最早记载于1500年前的《孙子算经》,是我国古代一个非常有名的问题,原文如下:今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?

翻译过来的意思是在一个笼子里关着若干只鸡和若干只兔,从上面数共有35个头;从下面数共有94只脚。问笼中鸡和兔的数量各是多少?题目要计算鸡的数量和兔的数量,通过分析可以知鸡的数量应该为0~35之间的数。

基于该思路,可以使用穷举法来逐个判断是否符合条件,从而得到答案。暴力穷举.....,Java代码实现如下:

public class Test {
    /** 鸡的数量、兔子数量 */
    public static int chicken, rabbit;

    /** 穷举.... */
    public static boolean getAmount(int header, int foot) {
        boolean flag = false;
        int j; // j 兔子数量
        for (int i = 0; i < header; i++) { // i 鸡的数量
            j = header - i;
            if (foot == (2 * i + 4 * j)) {
                chicken = i;
                rabbit = j;
                flag = true;
            }
        }
        return flag;
    }

    /** 测试结果:有鸡23只, 有兔12个 */
    public static void main(String[] args) {
        // 上有三十五头,下有九十四足,问鸡兔各几何?
        if (getAmount(35, 94)) {
            System.out.println("有鸡" + chicken + "只, 有兔" + rabbit + "个");
        }
    }
}

当然,鸡兔同笼问题,最简单的是使用解方程的思路了,设置x,y分别代表鸡和兔,foot,header分别代表足和头,那么可以得到一个一元二次方程组:x + y = header; 2*x + 4*y = foot; 消元求解可得:y = (foot - 2*header)/2 ; x = header-y;  这样也解出了鸡兔同笼的问题。

百钱买百鸡问题

百钱买百鸡是一个非常经典的不定方程问题,最早源于我国古代的《算经》,这是古代著名数学家张丘建首次提出的。百钱买百鸡问题的原文如下:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

翻译过来的意思是公鸡5文钱1只,母鸡3文钱1只,小鸡3只1文钱,如果用100文钱买100只鸡,那么公鸡、母鸡和小鸡各应该买多少只呢?使用解方程的思路的话,该问题中,有三个变量:公鸡数量、母鸡数量和小鸡数量,分别设为x、y和z。这三者应该满足如下关系:x+y+z=100; 5x+3y+z/3=100; 这里有三个变量,两个方程,因此是一个不定方程问题,这将导致求解的结果不只一个。

当然,这里使用穷举法来逐个判断是否符合条件,从而得到答案,很暴力很粗鲁,Java代码实现如下:

public class Test {
    /**
     * 打印结果:
     *  有鸡翁0只, 有鸡母25只, 有鸡雏75只
     *  有鸡翁4只, 有鸡母18只, 有鸡雏78只
     *  有鸡翁8只, 有鸡母11只, 有鸡雏81只
     *  有鸡翁12只, 有鸡母4只, 有鸡雏84只
     **/
    public static void main(String[] args) {
        getChickenAmount(100, 100);
    }

    /**
     * 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
     */
    public static void getChickenAmount(int money, int amount) {
        int k; // k 鸡雏
        for (int i = 0; i < amount; i++) { // i 鸡翁
            for (int j = 0; j < amount; j++) { // j 鸡母
                k = amount - i - j;
                if (k > 0 && (k % 3 == 0) && (5 * i + 3 * j + k / 3) == money) {
                    System.out.println("有鸡翁" + i + "只, 有鸡母" + j + "只, 有鸡雏" + k + "只");
                }
            }
        }
    }
}

3、穷举的优缺点

穷举的优点就是直观,会粗鲁的列举出每一种情况,这也成为了其致命的缺点,会造成程序运行效率低,代码冗余等问题,一般不推荐使用。

参考书籍:《Java常用算法手册(第3版)》

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值