经典算法 -枚举(百钱百鸡案例)

前言

算法系列第二站是枚举,也叫穷举和暴力破解法,和名字一样,简单直接,一起来看看吧

一,什么是穷举

在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法

枚举法的特点就是可以对于无法规律性解决的问题进行蛮力解决,但是带来的副作用就是当运算量级太大时就很难去应付

二,算法的实现

案例:百鸡问题

有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?

对本问题分析,三种鸡的数量关系满足:

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;
        }
}

四,枚举思想的培养

和其他算法不同的是,枚举是没有规律的情况下来使用,所以就很难来推算什么情况来使用是合适的,不过总的来说,枚举还是适用于那些量级比较小的,循环使用痕迹比较重的情况

你可能感兴趣的:(经典算法,1024程序员节,算法,枚举类)