1. 程式人生 > >M個蘋果放在N個盤子裡,有多少種不同的放法

M個蘋果放在N個盤子裡,有多少種不同的放法

1. 問題

        M個同樣的蘋果放N個同樣的盤子,允許有盤子空著, 問有多少种放法?

 

2.分析

    

令f(m,n)表示m個蘋果放到n個盤子裡有多少种放法,下面分類討論:

  1.  m<n時,至少有n-m個盤子空著(這些空盤子並不影響最後的結果,因為每種方法都帶有著些空盤子)。只考慮m個蘋果放m個盤子   f(m,n)=f(m,m)
  2.  m>n時,按是否有空盤子 分2種情況:

           a.假設至少一個盤子空著,相當於f(m,n)=f(m,n-1)
           b.所有的盤子都有蘋果,假設每個盤子可以先放一個,問題就變成:m-n個蘋果放到n個盤子,即f(m,n)=f(m-n,n)

           總的放法為二者之和, f(m,n)=f(m,n-1)+f(m-n,n)

     3. 臨界條件

          n=1時,所有蘋果都放在同一個盤子裡   f(m,n)=1
          m=0時,沒有蘋果                    f(m,n)=1

 

 

3.code

   用遞迴實現分治

public int fun(int m,int n){
		if(m<=1||n==1)
			return 1;
		else if ( n == 0)
			return 0;
		else if(n>m)
			return fun(m,n-1);
		return fun(m-n,n) + fun(m,n-1);
	}