m苹果放n篮子_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
intn,m;intmain()
{
m=5;n=3;inti,j;//全局變量默認初始化為0可以無需初始化了。//for (j=0;j
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<
cout<
}else{
dp[i][j]= dp[j][j];
cout<
cout<
}
cout<
}
cout<
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);
}intmain()
{int n=3,m=7;
cout<
}#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,intm)
{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);
}elsecount=fun(m,m);returncount;
}intmain()
{int n=3,m=7;
fun(n,m-n);
cout<
}
//測試數據: 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)
總結
以上是生活随笔為你收集整理的m苹果放n篮子_m个苹果放入n个篮子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 木马手工查杀和隐藏控制技术分析
- 下一篇: 苹果手机几月份最便宜_苹果手机越来越便宜