放蘋果

weixin_34377065發表於2012-09-08

轉自謀神http://www.cnblogs.com/celia01/archive/2012/02/19/2358673.html

 

 

蘋果放入盤子問題

【1】       M相同,N相同,可以為空;(poj 1664)

 

f(m-n,n):每個盤子都有蘋果

 

f(m,n-1):至少有一個盤子沒有蘋果

 

或者用陣列實現遞迴也可以:

 

f[m][n] = f[m-n][n]+f[m][n-1],其中f[][1],f[][0],f[1][],f[0][] 都為1。

 

即:f[m][n] = f[m][n - 1] + f[m - n][n];   

         = 1 // m== 0 || n == 1     

       = 0 // m < 0

 

int dfs(int m, int n){            //中直接輸出dfs(M,N);

    if (m<0)

        return 0;

    if (n==1||m==0)

        return 1;

    return dfs(m-n,n)+dfs(m,n-1);

}

【2】M相同,N相同,不可為空:

 

可以先把每個都放一個蘋果,這樣問題就轉化為:m-n個蘋果放進n個盤子裡,盤子允許空,即問題【1】

 

 

 

【3】M相同,N不同,可為空:(hdu 4390)

 

盤子是不一樣的,相當於m+n個位置放n個盤子,而且最後一個位置必須是盤子。這樣,每個盤子之前有幾個空位,就是有幾個蘋果,於是=  C( m+n-1 , n-1 )

 

【4】M相同,N不同,不可為空:

 

在問題【3】中之所以轉換為m+n是因為,m可能大於n,這裡不可為空,自然m≥n了,可採用隔板法,在相同的m之間去隔板,而且最後一個蘋果後放置一塊板子,並且第一個蘋果前不能放置板子,即在m-1個空隙中設定n-1個隔板,所以為C( m-1 , n-1 )

 

【5】M不同,N相同,可為空:

  sigma S(n,i) i=1..r      //即總數

 

【6】M不同,N相同,不可為空:

  S(n,r)

 

【7】M相同,N不同,不可為空:

  r!*S(n,r)

 

【8】M不同,N不同,可為空:

共N^M種。每個蘋果都有N中不同的選擇,共M個蘋果

 

 

 

以下是證明和解釋

問題1:

 

m----->相同, n---> 相同,可為空

 

將m個蘋果放進n個盤子中,盤子允許空,有多少種方法。同時注意例如1、2和2、1這兩種方案是一種方案。

 

 

 

思路:

 

其實這跟將一個整數m分成n個整數之和是類似的,

 

設f[m][n]為將m分成最多n份的方案數,且其中的方案不重複,每個方案前一個份的值一定不會比後面的大。

 

則有:f[m][n] = f[m][n - 1] + f[m - n][n];  

         = 1 // m== 0 || n == 1     

       = 0 // m < 0

 

 

 

f[m][n - 1]相當於第一盤子中為0,只用將數分成n - 1份即可。

因為0不會大於任何數,相當於f[m][n - 1]中的方案前面加一個為0的盤子,

而且不違背f的定義。所以f[m][n - 1]一定是f[m][n]的方案的一部分,即含有0的方案數。

f[m - n][n]相當於在每個盤子中加一個數1。因為每個盤子中加一個數1不會影響f[m][n - 1]中的方案的可行性,也不會影響f的定義。

所以f[m - n][n]一定是f[m][n]的方案的一部分,即不含有0的方案數。

 

 

 

問題2:

 

問題描述:將整數N分成K個整數的和 且每個數大於等於A  

小於等於B 求有多少種分法

 

int Dynamics(int n, int k, int min) //將n分為k個整數 最小的大於等於min,最大不超過B

{

 

    if(n < min) return 0;//當剩下的 比min小,則不符合要求 返回0

    if(k == 1) return 1; 

    int sum = 0;

    for(int t = min; t <= B; t++)

    {

     sum += Dynamics(n-t, k-1, t);

    }

    return  sum;

 

}

 

問題3:

 

m----->相同, n---> 相同,不能為空

 

將m個蘋果放進n個盤子中,有多少種方法。同時注意例如1、2和2、1這兩種方案是一種方案。

 

思路:

 

先把每個都放一個蘋果,這樣問題就轉化為:m-n個蘋果放進n個盤子裡,盤子允許空,即問題1

 

 

 

問題4:

 

第一類Stirling數是有正負的,其絕對值是包含n個元素的集合分作k個環排列的方法數目。

 

遞推公式為,

S(n,0) = 0, S(1,1) = 1.

S(n,k) = S(n-1,k-1) + (n-1)S(n-1,k)。

 

n個元素的集合分作k個環排列的方法是s(n,k),那麼

 

1.可由前n-1個元素k-1個環的s(n-1,k-1); 即最後一個元素為單環,前n-1個構成k-1環;

 

2.第n個元素一定不是單環,可以由n-1個元素k個環,把第n個數任意的放入一個環中組成新環!即得到n個

 

元素的集合分作k個環,假設n個元素的集合分作k個環,那麼由於n,不在單環中,那麼可以把n所在的環中把n

 

剔除,即得到了n-1個元素,k個環,即充分與必要性都得證!

 

因而:S(n,k) = S(n-1,k-1) + (n-1)S(n-1,k)。得證!

 

 

 

問題5:

 

第二類Stirling數是把包含n個元素的集合劃分為正好k個非空子集的方法的數目。

//n->有區別,K->非空,沒區別

遞推公式為,

S(n,n) = S(n,1) = 1,

S(n,k) = S(n-1,k-1) + kS(n-1,k).

 

 

上面的遞推式可以用組合證明:

一方面,如果將第n個元素單獨拿出來劃分成1個集合,那麼方法數是S(n-1,k-1);

另一方面,如果第n個元素所在的集合不止一個元素,那麼可以先將剩下的n-1個元素劃分好了以後再選一個集合把第n個元素放進去,方法數是k*S(n-1,k);

有加法原理得證

 

 

 

問題6:

 

Bell數和Stirling數

 

B(n)是包含n個元素的集合的劃分方法的數目。

 

集合的劃分:非空,

 

B(0) = 1, B(1) = 1,

 

B(n) = Sum(1,n) S(n,k).其中Sum(1,n)表示對k從1到n求和,s是第二類stirling數

 

 

 

問題7:

 

當K是有區別的時候,則一般都要在沒有區別的基礎上乘以K的全排列。

相關文章