m個蘋果放入n個籃子


題目 :X個相同的蘋果放入Y個籃子,
(1)籃子可以為空 ,籃子不同。 放法有C(X+Y-1,Y-1 );//
 (2)籃子不可以為空,籃子不同.放法有C(X-1,Y-1) //插擋板法 

       分析有了這個組合公式,參考我的 求組合數 程序即可解決問題。
(3)籃子可以為空,籃子相同。按上面程序求解 遞推公式dp[i][j]=dp[j-i][i]+dp[j][i-1]

#if 0
/*
m個相同的蘋果放入n個相同的籃子,籃子可以為空。
下面兩種方法求解,動態規划和遞歸。但都須知:
dp[0][j]=0;含義為:j(j>0)個蘋果放入0個籃子,沒有地方放,放法為0.
dp[i][0]=1;0個蘋果放入i個籃子,每個籃子都為空,放法為1.
dp[0][0]=1;當然,0個蘋果放到0個籃子放法為1.即0!=1;
還有 dp[i][j],i>j時,即籃子數大於蘋果數是dp[i][j]=dp[j][j],含義為 把2個蘋果放到5個籃子的放法和把2個蘋果放到2個籃子放法數相同。
*/ int dp[100][100];//全局,默認初始化為0 int n,m; int main() { m=5;n=3; int i,j; //全局變量默認初始化為0可以無需初始化了。 // for (j=0;j<m;j++)//蘋果 // { // dp[0][j]=0; // } //可以再拆分,也無需初始化。 // for (i=0;i<n;i++)//籃子 // { // dp[i][0]=1; // } dp[0][0] = 1; for(i = 1; i <= n; ++i)//籃子 for( j =0; j <= m; ++j)//蘋果 { if(j>=i) { dp[i][j] = dp[i][j-i] + dp[i-1][j]; cout<<"dp["<<i<<"]["<<j<<"] = dp["<<i<<"]["<<j-i<<"] + dp["<<i-1<<"]["<<j<<"]"; cout<<":"<<dp[i][j]<<" = "<<dp[i][j-i]<<" + "<<dp[i-1][j]; } else { dp[i][j] = dp[j][j]; cout<<"dp["<<i<<"]["<<j<<"] = dp["<<j<<"]["<<j<<"]"; cout<<":"<<dp[i][j]<<" = "<<dp[j][j]; } cout<<endl; } cout<<dp[n][m]<<endl; //} return 0; } #endif //遞歸求解
#if
0 int fun(int n,int m)
{
  if (n==0&&m!=0)//籃子為空
   return 0;
  else if (m==0)
 {
   return 1;   
  }
    else if (m>=n)
    {
   return fun(n,m-n)+fun(n-1,m);
    }
  else
   return fun(m,m);  
 
}
int main() { int n=3,m=7; cout<<fun(n,m)<<endl; } #endif

測試數據: 3 7 count=8
               3 5 count=5


(4)籃子不可以為空,籃子相同。沒有遞推公式:但是dp[X][Y]=dp[X-Y][Y], 計算dp[X-Y][Y]可以用(3)中遞推公式。
下面求解(4)的情況

//籃子不可以為空,即m>=n;
int count=0;
int fun(int n,int m)
{
    if (n==0&&m!=0)//籃子為空
        count=0;
    else if (m==0)
    {
        count=1;         
    }
    else if (m>=n)
    {
        count=fun(n,m-n)+fun(n-1,m);
    }
    else
        count=fun(m,m);        
    
    return count;    
}

int main()
{
    int n=3,m=7;
    fun(n,m-n);
    cout<<count<<endl;
}
//測試數據: 3,5 count=2;
3,7 count=4;

 

 

數學模型為正整數的分拆

詳見組合數學書第二章

1、C(n,r) 從n個不同的球中取出r個,放進r個相同的 盒子中,不許空盒,有多少種放法.

2、P(n,r) 從n個不同的球中取出r個,放進r個不相同 的盒子中,不許空盒,有多少種放法.

3、 r個相同的球放進n個不同的盒子中,允許 空盒,有多少種放法. 正整數的有序拆分

4 、n個無區別 的球放進r個無區別的盒子,允許空盒。正整數的無序拆分.

書上公式:

n拆分為m個無序的數:

              1                   m=1或n=1

Q(n,m)= Q(n,n)            m>n

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

              Q(n,m-1)+Q(n-m,m)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM