動態規劃 遞迴(poj1664 放蘋果)

2021-08-19 18:49:46 字數 1761 閱讀 3167

放蘋果

time limit:1000ms

memory limit:10000k

total submissions:36485

accepted:22473

description

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

input

第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。

output

對輸入的每組資料m和n,用一行輸出相應的k。

sample input

1

7 3

sample output

8令f(m,n)表示m個蘋果放到n個盤子裡有多少種放法:

(1):當盤子數為1的時候,只有一種放法就是把所有蘋果放到乙個盤子裡。

(2):當蘋果數為1的時候,也只有一種放法,注意題目中說明,盤子之間並無順序,所以不管這個蘋果放在哪個盤子裡,結果都算乙個。

(3):當m(4):當m==n時

,分兩種情況討論,一種

是至少有乙個盤子裡不放蘋果,這樣子就相當於是f(m,m-1),第二種是

乙個盤子裡放乙個,

只是一種;

(5):當m>n時,也分兩種情況討論,一種是至少有乙個盤子裡不放蘋果,這樣子就相當於f(m,n-1)

,第二種是(所有盤子都放)先取出n個蘋果乙個盤子裡放乙個,再將剩下的m-n個蘋果放到n個盤子裡去,即f(m-n,n);

綜上所述:

得到遞迴表示式:

f(m,n)=1 當 m=1或n=1;

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

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

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

解題分析:

9 設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論,

10 當n>m:必定有n-m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m)  

11 當n<=m:不同的放法可以分成兩類:

12 1、有至少乙個盤子空著,即相當於f(m,n) = f(m,n-1);

13 2、所有盤子都有蘋果,相當於可以從每個盤子中拿掉乙個蘋果,不影響不同放法的數目,即f(m,n) = f(m-n,n).

14 而總的放蘋果的放法數目等於兩者的和,即 f(m,n) =f(m,n-1)+f(m-n,n)

15 遞迴出口條件說明:

16 當n=1時,所有蘋果都必須放在乙個盤子裡,所以返回1;

17 當沒有蘋果可放時,定義為1種放法;

18 遞迴的兩條路,第一條n會逐漸減少,終會到達出口n==1;

19 第二條m會逐漸減少,因為n>m時,我們會return f(m,m) 所以終會到達出口m==0.

20 */

21 #include22

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

24 32

33 int main()

34 42 }

poj 1664 放蘋果 動態規劃

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

動態規劃 POJ1664 放蘋果

非常經典的劃分數問題,即相當於把m個物體分成至多n組,求出分組總數。思路 當前狀態dp i j 表示將i個物體分成至多j組的分組總數。對於當前狀態,有以下兩種情形 1 j組中有組為空,則這種情況下分組總數相當於將i個物體分成至多j 1組。即dp i j 1 2 j組中沒有組為空,則每一組至少有乙個物...

poj1664放蘋果 遞迴

放蘋果time limit 1000ms memory limit 10000k total submissions 23149 accepted 14694 description 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1...