定义
本质解释:就是从候选答案集合中选择正确答案
满足条件
- 可预先确定候选答案的数量
- 候选答案的范围在求解之前必须有一个确定的集合
实例:填数游戏
- 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]);
}
}
}
}
}
}
}
}
优缺点:
- 缺点
用枚举法解题的最大的缺点是运算量比较大,解题效率不高,如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。但枚举算法的思路简单,程序编写和调试方便,比赛时也容易想到,在竞赛中,时间是有限的,我们竞赛的最终目标就是求出问题解,因此,如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么我们最好是采用枚举法,而不需太在意是否还有更快的算法,这样可以使你有更多的时间去解答其他难题。 - 优点
由于枚举法一般是现实生活中问题的“直译”,因此比较直观,易于理解;枚举法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
枚举法的时间复杂度可以用状态总数*考察单个状态的耗时来表示,因此优化主要是:
- 减少状态总数(即减少枚举变量和枚举变量的值域)
- 降低单个状态的考察代价
优化过程从几个方面考虑。具体讲
- 提取有效信息
- 减少重复计算
- 将原问题化为更小的问题
- 根据问题的性质进行截枝
- 引进其他算法