數據結構與算法之枚舉(窮舉)法 C++實現

枚舉法的本質就是從所有候選答案中去搜索正確的解,使用該算法需要滿足兩個條件:
1、可以先確定候選答案的數量;
2、候選答案的範圍在求解之前必須是一個確定的集合。
枚舉是最簡單,最基礎,也是最沒效率的算法
枚舉法優點:
1、枚舉有超級無敵準確性,只要時間足夠,正確的枚舉得出的結論是絕對正確的。
2、枚舉擁有天下第一全面性,因爲它是對所有方案的全面搜索,所以,它能夠得出所有的解。
程序優化:
對於枚舉算法,加強約束條件,縮小枚舉的範圍,是程序優化的主要考慮方向

實例1:百錢買百雞
一百個銅錢買了一百隻雞,其中公雞一隻3錢、母雞一隻5錢,小雞一錢3只,問一百隻雞中公雞、母雞、小雞各多少)
代碼:
#include<iostream>
const int COCKPR = 3;
const int HENPR = 5;
const int CHICKS = 3;  //原錯誤const double CHICKPR = 1/3; 1 3 爲整形,1/3也爲整形所以爲0,重新聲明1錢能買3只小雞
void buyChicken(int money, int chooks);
int main()
{
    int money = 100;
    int chooks = 100;
    buyChicken(money, chooks);
    return 0;
}
void buyChicken(int money, int chooks)
{
    using namespace std;
    int MaxCock = money/COCKPR;
    int MaxHen = money/HENPR;
    int MaxChick = chooks;
    int cock,hen,chick;
    int count = 0;
    for(cock=0; cock<= MaxCock; cock++)
    {
        for(hen=0; hen<=MaxHen; hen++)
        {
            for(chick=0; chick<=MaxChick; chick++)
            {
                if (0 == chick%3 && cock + hen + chick == chooks && COCKPR*cock + HENPR*hen + chick/CHICKS == money)
                    cout << "公雞: " << cock << " 母雞: " << hen << " 小雞: " << chick << " 第 " << count << "有結果" <<endl;
                count ++;
            }
        }
    }
    cout << "總共枚舉多少次:" << count <<endl;
}
運行結果:

只對小雞的數量添加一個最小的起始值
函數裏面加 int MinChick = chooks-MaxCock-MaxHen;
把最裏層小雞數量的for循環的起始條件改爲小雞最小值 for(chick=MinChick; chick<=MaxChick; chick++) 
運算時間複雜度如下。時間複雜度減少一半。說明對於枚舉算法,加強約束條件,縮小枚舉的範圍,是程序優化的主要考慮方向。

代碼如下:
#include<iostream>
const int COCKPR = 3;
const int HENPR = 5;
const int CHICKS = 3;  //原錯誤const double CHICKPR = 1/3; 1 3 爲整形,1/3也爲整形所以爲0,重新聲明1錢能買3只小雞
void buyChicken(int money, int chooks);
int main()
{
    int money = 100;
    int chooks = 100;
    buyChicken(money, chooks);
    return 0;
}
void buyChicken(int money, int chooks)
{
    using namespace std;
    int MaxCock = money/COCKPR;
    int MaxHen = money/HENPR;
    int MaxChick = chooks;
	int MinChick = chooks-MaxCock-MaxHen;
    int cock,hen,chick;
    int count = 0;
    for(cock=0; cock<= MaxCock; cock++)
    {
        for(hen=0; hen<=MaxHen; hen++)
        {
            for(chick=MinChick; chick<=MaxChick; chick++)
            {
                if (0 == chick%3 && cock + hen + chick == chooks && COCKPR*cock + HENPR*hen + chick/CHICKS == money)
                    cout << "公雞: " << cock << " 母雞: " << hen << " 小雞: " << chick << " 第 " << count << "有結果" <<endl;
                count ++;
            }
        }
    }
    cout << "總共枚舉多少次:" << count <<endl;
}


實例2:填數字遊戲
代碼:
#include<iostream>
int main()
{
    using namespace std;
    int t1,t2,t3,t4,t5;
    for (t1=1; t1<=9; t1++)
    {
        for(t2=0; t2<=9; t2++)
        {
            for(t3=0; t3<=9; t3++)
            {
                for(t4=0; t4<=9; t4++)
                {
                    for(t5=0; t5<=9; t5++)
                    {
                        if(t5*100000 + t5*10000 + t5*1000 + t5*100 + t5*10 + t5 == t5*t1 + t4*t1*10 + t3*t1*100 + t2*t1*1000 + t1 *t1*10000 )
                        {
                            cout << " 算的數值爲: " << t1 << " 法的數值爲: " << t2 << " 描的數值爲: " <<t3 << " 述的數值爲: " << t4 << " 題的數值爲: " << t5<<endl;
                            cout << " " << t1 << " " << t2 << " " << t3 << " " << t4 << " " << t5 <<endl;
                            cout << "X " << t1<<endl;
                            cout << "________________\n";
                            cout << " " << t5 << " " << t5 << " " << t5 << " " << t5 << " " << t5 << " " << t5 <<endl;
                        }
                    }
                }
            }
        }
    }
    return 0;
}
運行結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章