前言
算法系列第二站是枚举,也叫穷举和暴力破解法,和名字一样,简单直接,一起来看看吧
一,什么是穷举
在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法
枚举法的特点就是可以对于无法规律性解决的问题进行蛮力解决,但是带来的副作用就是当运算量级太大时就很难去应付
二,算法的实现
案例:百鸡问题
有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?
对本问题分析,三种鸡的数量关系满足:
nub(公鸡)+nub(母鸡)+nub(小鸡)=100
nub(公鸡)* 5+nub(母鸡)* 3+nub(小鸡)=100
三个变量只有两个公式如何求解呢,这个时候只能固定一个变量,然后求另外两个变量,枚举法就是基于这样的思想,对于所有可能性进行遍历
三,算法的实现
基本思路:
使用两个for循环固定两个变量,则可以使用上面的判断公式来判断这组数据是否满足要求,如果满足,则输出:
具体代码:
对于for循环最大值,很明显公鸡数量最大值为20只,二母鸡最大的数量为33只,通过两个最大量来限制遍历范围,这也是枚举的有穷性的特点
void GetNub()
{
int n,m,k; //n:公鸡数量,m:母鸡数量,k:小鸡数量
for(n=0;n<=20;n++)
for(m=0;m<=33;m++)
{
k=100-n-m;
if(15*n+9*m+k==300) cout<<n<<" "<<m<<" "<<k<<endl;
}
}
四,枚举思想的培养
和其他算法不同的是,枚举是没有规律的情况下来使用,所以就很难来推算什么情况来使用是合适的,不过总的来说,枚举还是适用于那些量级比较小的,循环使用痕迹比较重的情况