算法笔记方法论4 枚举法 详细笔记

寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。
—苏轼

说到暴力,我们大家最先想到一定是枚举,但是枚举真的是一门技术,怎么样把所有情况一个不落下的枚举出来是比较难的,所以我们这节课给大家讲解一下枚举法。

知识点

  • 简单型枚举
  • 组合型枚举
  • 排列型枚举
  • 指数型枚举

枚举法

枚举算法的思想:

将问题的所有可能成为答案的解一一列举,然后根据问题所给出的条件判断此解是否合适,如果合适就保留,反之则舍弃。

枚举算法解题的基本思路:

  1. 确定枚举解的范围,以及判断条件
  2. 选取合适枚举方法,进行逐一枚举,此时应注意能否覆盖所有的可能的解
  3. 在枚举时使用判断条件检验,留下所有符合要求的解。

枚举算法的一般步骤:

  1. 根据题目确定枚举的范围,并选取合适的枚举方式,不能遗漏任何一个真正解,同时避免重复。
  2. 为了提高解决问题的效率,看题目是否存在优化,将可能成为解的答案范围尽可能的缩小。
  3. 根据问题找到合理并、准确好描述并且好编码的验证条件。
  4. 枚举并判断是否符合第三步确定的的条件,并保存符合条件的解。
  5. 按要求输出枚举过程中留下的符合条件的解。

枚举法也是有很多技巧和方法的,这节课我们将从如下几种方法为大家进行讲解。

简单型枚举

简单型枚举就是可以通过简单的 for 循环嵌套就可以解决的问题。我们之前的课讲的题目都算是简单型枚举的范畴,所以简单型枚举是比较简单,也是大家接触最多的一种枚举方式。

这种枚举方式没有特定的固定枚举方式,而且都比较简单,按照题目的要求进行设计代码即可完成解题。

我们用一个题复习一下。

题目10 42点问题

题目描述:

众所周知在扑克牌中,有一个老掉牙的游戏叫做24点,选取4张牌进行加减乘除,看是否能得出24这个答案。
现在小蓝同学发明了一个新游戏,他从扑克牌中依次抽出6张牌,注意不是一次抽出,进行计算,看是否能够组成 42 点,满足输出YES,反之输出 NO。
最先抽出来的牌作为第一个操作数,抽出牌做第二个操作数,运算结果在当作第一个操作数,继续进行操作。
除不尽的情况保留整数。
请设计一个程序对该问题进行解答。

样例:

输入:
K A Q 6 2 3  

输出:
YES

对于上面的样例我们进行了如下计算;

1. K*A=K 即 13*1=13
2. 13/12=1 保留整数
3. 1+6=7
4. 7*2=14
5. 14*3=42

运行限制:

最大运行时间:1s
最大运行内存: 128M

代码:

public class _1024点问题 {
   

    static int[] a = new int[10];
    static Vector<Vector<Integer>> ans = new Vector<Vector<Integer>>();

    public static void main(String[] args) {
   
        Scanner in = new Scanner(System.in);

        for (int i=0; i<6; ++i) {
   
            String c;
            c = in.next();
            if (c.charAt(0) == 'A') {
   
                a[i] = 1;
            } else if (c.charAt(0) == 'J') {
   
                a[i] = 11;
            } else if (c.charAt(0) == 'Q') {
   
                a[i] = 12;
            } else if (c.charAt(0) == 'K') {
   
                a[i] = 13;
            } else {
   
                a[i] = (c.charAt(0) - '0');
            }
        }

        ans.addElement(new Vector<Integer>()); // 构造二维数组
        ans.get(0).addElement(a[0]); // v[0][0] = a[0]

        for (int i=1; i<=5; ++i) {
   
            ans.addElement(new Vector<Integer>())
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值