今天學習常見的演算法之一」窮舉法「,所謂窮舉則為就是把有限集合的所有元素逐一進行比較,進行判斷和處理,從而得出所需結果。
窮舉的乙個比較實用的示例百雞問題:公雞5元乙隻,母雞3元乙隻,小雞1元3只,求100元錢買一百隻雞,公雞、母雞、小雞的數量各是多少。
用我們所學的數學可以得出以下方程式:
a+b+c=100;
a*5+b*3+c/3=100;
c%3=0;
問題分析,100元錢買100隻雞的問題,母雞公雞小雞的數量都是不確定的有可能有多種組合答案,不管有多少種都要滿足以上列出的方程式,進而我們可以猜測滿足問題的答案可能為三個陣列,對應索引的數量組成問題的答案,根據問題進一步聯想100元錢買100隻雞,從而問題昇華為n元錢買n隻雞的問題,進而問題轉化為了程式
從分析中可以得知宣告三個陣列
arraylist g = new arraylist(),--公雞
m = new arraylist(),--母雞
s = new arraylist();--小雞
因為母雞、公雞和小雞的各自的數量應為0到n的任意整數,所以總結出我們可以使用最直接的方法使用三層迴圈的方式,找出我們所有的答案,這就使用了窮舉法處理了陣列中所有的元素了實現**如下
1public
int chicken_question(int
n, arraylist g, arraylist m, arraylist s)217
}18}19
}2021return
k;22 }
以上這個實現方式有三重迴圈,第一重迴圈執行次數為n+1次,第二重迴圈為(n+1)*(n+1)次,第三次迴圈為n+1的三次方,當n=100時最內層迴圈的執行就大於100萬次之多,從而效率肯定不理想。
從數學方程式的解析思路,一共有三個未知數,應該可以減少乙個未知數即減少一層迴圈,那麼可不可以減少迴圈的次數呢?答案是肯定的,這就使用的演算法的思想,使用極限的方式分析問題,假如n元錢全買公雞最多能買多少呢,無疑是n/5,從而得知最多買母雞數量為n/3,即最外層迴圈的最大次數為n/5+1,第二層迴圈次數最大為n/3+1,小雞的數量為c=n-a-b從而內層迴圈去除,實現**如下
1public
int chicken_questiontwo(int
n, arraylist g, arraylist m, arraylist s)218
}19}20
21return
k;22 }
分析以上**,我們省略了窮舉方法中沒有必要的一些組合,從而提高了程式的執行效率,第一層迴圈執行的次數為n/5+1,第一層為(n/5+1)*(n/3+1),當n為100時內層迴圈執行次數為714次,從而大大提高了程式的執行效率,可見演算法分析中極限分析十分重要。
窮舉法演算法練習
answer include include double a,b,c,d void sort num intmain 注意使用pow書寫冪函式 注意輸出條件 空格隔開,及最後乙個輸出數值後面不能加空格。因為該題輸出的個數有限,以上是乙個簡單方法。還可以使用c 的陣列進行操作。include ios...
演算法學習 暴力破解!列舉法(窮舉法)
暴力破解最常用的就是列舉法,也叫窮舉法。這是我在剛接觸演算法的時候,用的最順手的 也是最愛用的方法哈哈哈,我把他叫做 暴力遞迴 列舉法是在分析問題時,逐個列舉出 所有可能情況,然後根據條件判斷此答案是否合適,合適就保留,不合適就丟棄,最後得出一般結論。主要利用計算機運算速度快 精確度高的特點,對要解...
演算法設計思想(1) 窮舉法
本文系 王曉華 老師 gitchat 演算法應該怎麼玩 課程筆記。窮舉法又稱窮舉搜尋法,是一種在問題域的解空間中對所有可能的解窮舉搜尋,並根據條件選擇最優解的方法的總稱。數學上也把窮舉法稱為列舉法,就是在乙個由有限個元素構成的集合中,把所有元素一一枚舉研究的方法。窮舉法一般用來找出符合條件的所有解,...