穷举法
穷举法,也称为枚举法,是指从可能的集合中一一枚举各个元素,用给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。
基本思路
采用枚举算法求解问题的基本思路
-
确定枚举对象,枚举范围和判定条件
-
枚举可能的解,验证是否是问题的解
适用枚举算法求解的问题必须满足两个基本条件:
优缺点
优点:
由于枚举法一般是现实生活中问题的“直译”,因此比较直观,易于理解;枚举法建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
缺点:
用枚举法解题的最大的缺点是运算量比较大,解题效率不高,如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。
穷举法优化
在枚举算法中,枚举对象的选择是非常重要的,它直接影响着算法的时间复杂度,选择适当的枚举对象可以获得更高的效率。
枚举算法是用计算机解决问题的一种特色,特点是算法的思路简单,但运算量大。
穷举法优化策略
-
减少枚举次数
-
合理选择用于枚举的变量
-
注意枚举的顺序
-
减少判断每种情况的时间
实例练习 --百钱百鸡
题目描述
百钱买百鸡:某人有 100 块钱,打算买 100 只鸡,其中公鸡 1 只 5 块,母鸡 1 只 3 块,小鸡 3 只 1 块,问可买多少只公鸡、多少只母鸡、多少只小鸡?
问题分析
从题意可知公鸡可买 0~20 只,母鸡可买 0~33 只,小鸡可买 0~100 只,枚举出各种鸡的可能数目,然后使用鸡的总数为 100,且花费的钱数为 100 块两个条件进行判定,最终可以找出题目的解
参考代码
class Program
static void Main(string[] args)
for (int i = 0; i <= 20; i++) // 公鸡最多20只
for (int j = 0; j <= 33; j++) // 母鸡最多33只
for (int k = 0; k <= 100; k++) // 小鸡最多100只
// 100只鸡 && 100块钱 && 小鸡数是3的倍数
if (i + j + k == 100 &&
5 * i + 3 * j + k / 3 == 100 &&
k % 3 == 0)
Console.WriteLine("公鸡{0}只,母鸡{1}只,小鸡{2}只", i, j, k);
Console.ReadLine();
由于三种鸡的和是固定的,因此只要枚举两种鸡(i、j),第三种鸡就可以根据约束条件求得(k=100-i-j),这样就缩小了枚举范围变成双重循环。
class Program
static void Main(string[] args)
for (int i = 0; i <= 20; i++) // 公鸡最多20只
for (int j = 0; j <= 33; j++) // 母鸡最多33只
int k = 100 - i - j; // 小鸡的数量
if (5 * i + 3 * j + k / 3 == 100 && k % 3 == 0)
Console.WriteLine("公鸡{0}只,母鸡{1}只,小鸡{2}只", i, j, k);
Console.ReadLine();