資料結構與演算法之枚舉(窮舉)法 C++實現,資料結構與演算法窮舉

來源:互聯網
上載者:User

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

#include<iostream>const int COCKPR = 3;const int HENPR = 5;const double CHICKPR = 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 + CHICKPR*chick == 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 double CHICKPR = 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 + CHICKPR*chick == money)                    cout << "公雞: " << cock << " 母雞: " << hen << " 小雞: " << chick << " 第 " << count << "有結果" <<endl;                count ++;            }        }    }    cout << "總共枚舉多少次:" << count <<endl;}

填數字遊戲
代碼:
#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;}
運行結果:


枚舉法是什

在進行歸納推理時,如果逐個考察了某類事件的所有可能情況,因而得出一般結論,那麼這結論是可靠的,這種歸納方法叫做枚舉法. 一、特點:將問題的所有可能的答案一一列舉,然後根據條件判斷此答案是否合適,合適就保留,不合適就丟棄。例如: 找出1到100之間的素數。需要將1到100之間的所有整數進行判斷。 枚舉演算法因為要列舉問題的所有可能的答案,所有它具備以下幾個特點: 1、得到的結果肯定是正確的; 2、可能做了很多的無用功,浪費了寶貴的時間,效率低下。 3、通常會涉及到求極值(如最大,最小,最重等)。 二、枚舉演算法的一般結構:while迴圈。 首先考慮一個問題:將1到100之間的所有整數轉換為位元表示。 演算法一: for i:=1 to 100 do begin 將i轉換為二進位,採用不斷除以2,餘數即為轉換為2進位以後的結果。一直除商為0為止。 end; 演算法二:二進位加法,此時需要數組來幫忙。 program p; var a:array[1..100] of integer; {用於儲存轉換後的二進位結果} i,j,k:integer; begin fillchar(a,sizeof(a),0); {100個數組元素全部初始化為0} for i:=1 to 100 do begin k:=100; while a[k]=1 do dec(k); {找高位第一個為0的位置} a[k]:=1; {找到了立刻賦值為1} for j:=k+1 to 100 do a[j]:=0; {它後面的低位全部賦值為0} k:=1; while a[k]=0 do inc(k); {從最高位開始找不為0的位置} write('(',i,')2='); for j:=k to 100 do write(a[j]); {輸出轉換以後的結果} writeln; end; end. 枚舉法,常常稱之為窮舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。 採用枚舉演算法解題的基本思路: (1) 確定枚舉對象、枚舉範圍和判定條件; (2) 一一枚舉可能的解,驗證是否是問題的解 下面我們就從枚舉演算法的的最佳化、枚舉對象的選擇以及判定條件的確定,這三個方面來探討如何用枚舉法解題。 例1:百錢買百雞問題:有一個人有一百塊錢,打算買一百隻雞。到市場一看,大雞三塊錢一隻,小雞一塊錢三隻,不大不小的雞兩塊錢一隻。現在,請你編一程式,幫他計劃一下,怎麼樣買法,才能剛好用一百塊錢買一百隻雞? 演算法分析:此題很顯然是用枚舉法,我們以三種雞的個數為枚舉對象(分別設為x,y,z),以三種雞的總數(x+y+z)和買雞用去的錢的總數(x*3+y*2+z)為判定條件,窮舉各種雞的個數。 下面是解這個百雞問題的程式 var x,y,z:integer; begin for x:=0 to 100 do for y:=0 to 100 do for z:=0 to 100 do{枚舉所有可能的解} if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); {驗證可能的解,並輸出符合題目要求的解} end. 上面的條件還有最佳化的空間,三種雞的和是固定的,我們只要枚舉二種雞(x,y),第三種雞就可以根據約束條件求得(z=100-x-y),這樣就縮小了......餘下全文>>
 
這是解析演算法還是枚舉演算法

是解析演算法吧:
解析法(analysis algorithm):用解析的方法,即找出表示問題的前提條件與結果之間關係的數學運算式,並通過運算式的計算來實現問題求解的方法。
枚舉的定義:根據所需解決問題的條件,把該問題所有可能的解,一一列舉出來,並逐個檢驗出問題真正解的方法。枚舉法也稱為窮舉法。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.