經典演算法之dfs——第一季(放蘋果)
dfs(深度優先演算法)
問題一:
放蘋果問題
問題描述:
把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。
輸入:第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。
輸出:對輸入的每組資料m和n,用一行輸出相應的k。
問題分析:
放蘋果的問題乍看之下很複雜,盤子是一樣的,蘋果也是一樣的;只要每個盤子裡面放的蘋果是一樣多的,不管順序如何最終得到的都是同一種分法。一遇到問題我們都會用常人的思維去思考問題。比如說:我會想著空乙個盤子是什麼情況,空兩個盤子是什麼情況,乙個盤子都不空又是什麼情況。越想腦子越亂,最後就得不到解題方法,但是就目前看的遞迴演算法而言。似乎是因為我想多了,其實我們需要把問題簡單化。就拿這個放蘋果的問題而言,我們只需要分兩種情況:
有空盤子和沒空盤子。
1.有空盤子:f(m,n)=f(m,n-1)//有空盤子很多人會有疑問,這不是只有乙個空盤子的情況嗎?那2個3個空盤子呢?這就需要遞迴的思想,隨著一步一步的將n換成n-1你就會發現那就是2,3個空盤子的情況。
2.沒有空盤子:f(m,n)=f(m-n,n)//沒有空盤子,我們可以看成先給每乙個盤子放乙個蘋果,則還剩下m-n個蘋果,剩下的問題就是把這m-n個蘋果放到n個盤子裡的問題了,也許有人會問,m-n個蘋果放到n個盤子也會出現空盤子的情況啊,不是和前面的有空盤子重複了?確實,會出現空盤子的情況,但是請注意,他們並不是真的空盤子,因為他們最開始已經放了乙個,他們在這裡的空代表著這個盤子只有最開始放的乙個蘋果。
因此:f(m,n)=f(m,n-1)+f(m-n,n) m>=n
上面的表示式並不完整,當m=n
c++:
#include#include#include#include#includeusing namespace std;
int dfs(int m,int n)//m個蘋果放到n個盤子裡
if(m < n)else
}int main()
return 0;
}
演算法俯仰即是,我自風情萬種與世無爭。 初學第一季
要增強體力,只有運動 要豐富知識,就只有讀書 鳥哥。學習linux也有段時間了,但是期間看了關於arm方面的書籍,及作業系統方面的書,linux用虛擬機器vm裝的,平時疏於聯絡。在鳥哥的linux書中從新開始學習,打下基礎。x window system 視窗系統名 由mit 所開發的一種流通的視窗...
自我反思 第一季
又來寫點東西了。考完了,有空了。最近總是在剖析自己。發現自己真是乙個 活在未來的人 以前這樣,現在還是這樣,人的性格真還是一樣難以改變的東西。現在我就在乙個三岔口,也許更多口。豬 gg說,不就是換個工作嘛,沒什麼了不起的。可是我總是在擔心未來。不做設計怕技術丟了,做設計又覺得沒有什麼進步的空間,想鍛...
vscode 報錯第一季
使用vscode寫vue時,遇到以下報錯 this relative module was not found 解決方法 此時在listorganizationcode.vue存在import func from vue temp vue editor bridge 將其刪除即可.引入此vue te...