演算法練習 1 放蘋果(分治演算法)

2021-08-11 05:08:01 字數 1419 閱讀 3102

首先談談分治演算法為何物。在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是「分而治之」,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法(快速排序,歸併排序),傅利葉變換(快速傅利葉變換)……

分治法的設計思想是:將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。

【問題描述】

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。

**先附上:

static int fun(int m, int n) // m個蘋果放在n個盤子中共有幾種方法  

【問題分析】

放蘋果的問題乍看之下很複雜,盤子是一樣的,蘋果也是一樣的;只要每個盤子裡面放的蘋果是一樣多的,不管順序如何最終得到的都是同一種分法。我屬於初學演算法,對於演算法不熟悉,一遇到問題就會用人的思維去思考問題,我會想著空乙個盤子是什麼情況,空兩個盤子是什麼情況,乙個盤子都不空又是什麼情況。越想腦子越亂,最後就得不到解題方法,但是就目前看的遞迴演算法而言。似乎是因為我想多了,其實我們需要把問題簡化。就拿這個放蘋果的問題而言,我們只需要分兩種情況:有空盤子和沒空盤子。

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

因此:f(m,n)=f(m,m)                m

寫到這裡主要表示式基本上已經寫完了,但是遞迴都需要有結束條件,結束條件並不是很難發現,當只有乙個盤子時明顯只有一種方法,另外沒有蘋果和只有乙個蘋果的時候也只有一種放法。即f(m,n)=1      n=1,m=0

綜上:f(m,n)=1                         n=1,m=0

f(m,n)=f(m,m)                m

f(m,n)=f(m,n-1)+

f(m-n,n)       m>=n  

「分治演算法」解決「放蘋果問題」

題目 把n個同樣的蘋果放在m個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。input 第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。output 對輸入的每組資料n和m,用一行輸出相...

演算法 放蘋果

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。對輸入的每組資料m和n,用一行輸出相應的k。設f m,n 為m個蘋果...

演算法 放蘋果問題

1.在說放蘋果問題之前,先說下斐波那契數列遞迴求解時的時間複雜度。由公式f n f n 1 f n 2 很容易畫出其遞迴樹 每個節點都會呼叫一次f n 滿二叉樹節點數m 2 h 1,h是樹高度。則o n 2 n.2.放蘋果問題 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種...