1. 枚举法
1.1 基本概念
枚举法,又称暴力算法,它就是把可能的结果一一列举出来,然后通过条件判断结果是否需要保留,通常枚举法通过循环来实现。枚举法的最大特点就是,在面对任何问题时,都会去尝试每一种解决方法。
枚举算法解题基本思路:
- 确定枚举对象、枚举范围和判定条件。
- 逐一列举可能的解,验证每一个解是否是问题的解。
枚举算法一般按照如下3个步骤进行:
- 题解的可能范围,不能遗漏任何一个真正的解,也要避免有重复。
- 判定是否是真正解的方法。
- 时可能解的范围降至最小,以便提高解决问题的效率。

1.2 案例
1.2.1 百钱买百鸡
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, 用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
https://blog.csdn.net/xiangxizhishi/article/details/79118561
x+y+z=100
5x+3y+z/3=100
因为用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有
5x < 100 ==> 0 < x < 20
3y < 100 ==< 0 < y < 33
package com.muzili.alg;/**** @author: muzili(李敷斌)* @date: 2021/7/24* @version: v0.0.1* @description: 百钱买百鸡*/public class BuyChickenSolution{public static void main(String[] args){int x = 0; //公鸡数量int y = 0; //母鸡数量int z = 0; //小鸡数量for(x = 1;x < 20;x++){for(y = 1;y < 33;y++){z = 100 - x - y;if(z % 3 != 0){continue;}int totalAmount = (x * 5) + (y * 3) + (z / 3);if(totalAmount == 100){System.out.println("100钱可买得公鸡"+x+"只,母鸡"+y+"只,小鸡"+z+"只!");}}}}}100钱可买得公鸡4只,母鸡18只,小鸡78只!100钱可买得公鸡8只,母鸡11只,小鸡81只!100钱可买得公鸡12只,母鸡4只,小鸡84只!Process finished with exit code 0
1.2.2 填写运算符
输入五个数,数与数之间用空格分开,然后给出结果,然后在5个数间只能添加“+”,“-”,“*”,“/”这4种运算符,使得等式成立。<br /> 例如:<br /> 输入五个运算数:3 3 3 3 3<br /> 输入结果:3
package com.muzili.alg;import com.muzili.stack.MathElCalcu;import java.math.BigDecimal;/*** 输入五个数,数与数之间用空格分开,然后给出结果,然后在5个数间只能添加“+”,“-”,“*”,“/”这4种运算符,* 使得等式成立。* 例如:* 输入五个运算数:3 3 3 3 3* 输入结果:3** 3+3+3-3-3=3* 3+3+3-3-3=3* 3+3+3-3-3=3* 3+3+3-3-3=3* 3-3-3+3+3=3* 3-3-3+3+3=3* 3-3-3+3+3=3* 3-3-3+3+3=3* 3*3*3/3/3=3* 3*3*3/3/3=3* 3*3*3/3/3=3* 3*3*3/3/3=3** @author: muzili(李敷斌)* @date: 2021/7/24* @version: v0.0.1* @description: 填写运算符*/public class FillOperatorSolution {char[] operators = {'+','-','*','/'};public void fillOperator(BigDecimal res,BigDecimal ... params){for (int i = 0; i < operators.length; i++) {for (int j = 0; j < operators.length; j++) {for (int k = 0; k < operators.length; k++) {for (int l = 0; l < operators.length; l++) {StringBuilder calcElSb = new StringBuilder(String.valueOf(params[0]));calcElSb.append(operators[i]);calcElSb.append(params[1]);calcElSb.append(operators[j]);calcElSb.append(params[2]);calcElSb.append(operators[k]);calcElSb.append(params[3]);calcElSb.append(operators[k]);calcElSb.append(params[4]);String calcEl = calcElSb.toString();MathElCalcu mathElCalcu = new MathElCalcu();BigDecimal calc = mathElCalcu.calc(calcEl);if (calc.compareTo(res) == 0){System.out.println(calcEl + "=3");}}}}}}public static void main(String[] args) {FillOperatorSolution solution = new FillOperatorSolution();solution.fillOperator(BigDecimal.valueOf(3),BigDecimal.valueOf(3),BigDecimal.valueOf(3),BigDecimal.valueOf(3),BigDecimal.valueOf(3),BigDecimal.valueOf(3));}}
1.3 枚举法的缺点
每一种可能的结果都会列举出来,哪怕它不是最总结果这样会耗费大量的时间。

