算法:枚举(穷举)法

定义

本质解释:就是从候选答案集合中选择正确答案

满足条件

  • 可预先确定候选答案的数量
  • 候选答案的范围在求解之前必须有一个确定的集合

实例:填数游戏
这里写图片描述

  • java代码
public class Enumerate {

    /**
     * @param args
     * 枚举法 填数游戏
     * 
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = new int[5];
        int result1, result2;
        for (a[0] = 1; a[0] <= 9; a[0]++) {
            for (a[1] = 0; a[1] <= 9; a[1]++) {
                for (a[2] = 0; a[2] <= 9; a[2]++) {
                    for (a[3] = 0; a[3] <= 9; a[3]++) {
                        for (a[4] = 0; a[4] <= 9; a[4]++) {
                            result1 = (a[0] * 10000 + a[1] * 1000 + a[2] * 100
                                    + a[3] * 10 + a[4])
                                    * a[0];
                            result2 = a[4] * 100000 + a[4] * 10000 + a[4]
                                    * 1000 + a[4] * 100 + a[4] * 10 + a[4];
                            if (result1 == result2) {
                                System.out.println(a[0] + " " + a[1] + " "
                                        + a[2] + " " + a[3] + " " + a[4]);
                                System.out.println("x" + "       " + a[0]);
                                System.out.println("_________");
                                System.out.println(a[4]+""+a[4]+a[4]+a[4]+a[4]+a[4]);
                            }
                        }
                    }
                }
            }
        }

    }

}

优缺点:

  • 缺点
    用枚举法解题的最大的缺点是运算量比较大,解题效率不高,如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。但枚举算法的思路简单,程序编写和调试方便,比赛时也容易想到,在竞赛中,时间是有限的,我们竞赛的最终目标就是求出问题解,因此,如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么我们最好是采用枚举法,而不需太在意是否还有更快的算法,这样可以使你有更多的时间去解答其他难题。
  • 优点
    由于枚举法一般是现实生活中问题的“直译”,因此比较直观,易于理解;枚举法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
枚举法的时间复杂度可以用状态总数*考察单个状态的耗时来表示,因此优化主要是:
  • 减少状态总数(即减少枚举变量和枚举变量的值域)
  • 降低单个状态的考察代价
优化过程从几个方面考虑。具体讲
  • 提取有效信息
  • 减少重复计算
  • 将原问题化为更小的问题
  • 根据问题的性质进行截枝
  • 引进其他算法
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记住我的名字啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值