import math
#考慮每個小球有m個盒子可以選擇放入,而一共又有n個小球,所以方案數為m^n
defdifferent_ball_different_box_empty
(ball,box)
:return
(box**ball)
#考慮插板法:將n個小球排成一排,將m−1塊板子插在小球之間的空隙中,由於一共有n−1個縫隙,所以答案為cm−1n−1。
defsame_ball_different_box_no_empty
(ball,box)
:return
(math.factorial(ball-1)
//(math.factorial(box-1)
*math.factorial(ball-box)))
#考慮插板後的結果,是m−1塊板子和n個小球一共n+m−1個物體排成一排,考慮這些物體中有m−1個板子即是一種方案,所以答案為cm−1n+m−1。
defsame_ball_different_box_empty
(ball,box)
:return
(math.factorial(ball+box-1)
//(math.factorial(box-1)
*math.factorial(ball)))
#考慮遞推,設f[n][m]表示將n個小球放入m個盒子中的方案數。由於小球互不相同,考慮第i個小球的方法,可以是放到前i−1個小球已經放過的盒子中,也可以放到乙個新盒子中。
#假設前i−1個小球已經占用了j個盒子,由於小球互不相同,故放了小球的盒子也應該被視為互不相同的,所以將第i個小球放入這些盒子共有j種不同方案。如果將第i個小球放入乙個新盒子,由於盒子都是相同的,所以只有一種方案。
#綜上所述,最後的遞推式為f[i][j]=j⋅f[i−1][j]+f[i−1][j−1]。
defdifferent_ball_same_box_no_empty
(ball,box):if
(box==1)
:return(1
)#所有球只能放在乙個盒子裡
elif
(ball==box)
:return(1
)#注意到盒子不能為空,所以只能乙個盒子放乙個球
else
:return
(different_ball_same_box_no_empty(ball-
1,box-1)
+box*different_ball_same_box_no_empty(ball-
1,box)
)#我們只需要在前一種情況的基礎上,對盒子做乙個全排列即可
defdifferent_ball_different_box_no_empty
(ball,box)
:return
(math.factorial(box)
*different_ball_same_box_no_empty(ball,box)
)#我們只需要在different_ball_same_box_no_empty的基礎上,列舉一下使用了多少個盒子即可
defdifferent_ball_same_box_empty
(ball,box)
: s=
0for m in
range(1
,box+1)
: s+=different_ball_same_box_no_empty(ball,m)
return s
#由於這種情況下小球都是相同的,所以我們不能再用放「第幾個」小球這樣的順序和思路來考慮問題了。換乙個思路,假設初始時我們既沒有盒子也沒有小球,考慮用如下兩個操作來構造出所有方案:增加乙個全新的盒子,或給所有已有的盒子中各放入乙個小球。
#容易知道,任意一種合法的方案都可以通過上述兩種操作構造出來,且構造方式是唯一的。設g[n][m]表示將n個小球放入m個盒子中的方案數,由兩種操作的描述即可得遞推式g[i][j]=g[i][j−1]+g[i−j][j]。
defsame_ball_same_box_empty
(ball,box):if
(ball==
0or box==1)
:return(1
)elif
(ball:return
(same_ball_same_box_empty(ball,ball)
)else
:return
(same_ball_same_box_empty(ball,box-1)
+same_ball_same_box_empty(ball-box,box)
)#參考上一種情況,只需事先給每個盒子放入乙個球即可,總方案數為g[n−m][m]。
defsame_ball_same_box_no_empty
(ball,box)
:return same_ball_same_box_empty(ball-box,box)
defmain()
:print
('請選擇模式:'
)print
('輸入小球狀態——「相同:1」\「不相同:0」'
) str1=
input()
if(str1==
'1')
: a=
true
elif
(str1==
'0')
: a=
false
print
('輸入盒子狀態——「相同:1」\「不相同:0」'
) str2=
input()
if(str2==
'1')
: b=
true
elif
(str2==
'0')
: b=
false
print
('輸入盒子狀態——「允許為空:1」\「不允許為空:0」'
) str3=
input()
if(str3==
'1')
: c=
true
elif
(str3==
'0')
: c=
false
ball=
int(
input
('請輸入小球的個數:'))
box=
int(
input
('請輸入盒子的個數:'))
print
('方案數:')if
((not a)
and(
not b)
and c )
:print
('%d'
%different_ball_different_box_empty(ball,box)
)elif
(a and
(not b)
and(
not c)):
print
('%d'
%same_ball_different_box_no_empty(ball,box)
)elif
(a and
(not b)
and c)
:print
('%d'
%same_ball_different_box_empty(ball,box)
)elif((
not a)
and b and
(not c)):
print
('%d'
%different_ball_same_box_no_empty(ball,box)
)elif((
not a)
and(
not b)
and(
not c)):
print
('%d'
%different_ball_different_box_no_empty(ball,box)
)elif((
not a)
and b and c)
:print
('%d'
%different_ball_same_box_empty(ball,box)
)elif
(a and b and c)
:print
('%d'
%same_ball_same_box_empty(ball,box)
)else
:print
('%d'
%same_ball_same_box_no_empty(ball,box)
)if __name__ ==
'__main__'
: main(
)
新人首次作答,謝謝支援! 關於盒子與球的問題
故事發生在某一天的下午,我如同往常一樣開啟題目.然後成功被一堆相同的不同的盒子和球繞暈惹 t t 為了防止自己再次忘記我覺得還是有必要記錄一下哈哈哈哈 1 給定 n 個不同的球,放進 m 個不同的盒子,盒子允許為空,有多少種方案?2 給定 n 個不同的球,放進 m 個不同的盒子,盒子不允許為空,有多...
問題 I 盒子與球 box
問題 i 盒子與球 box 時間限制 1 sec 記憶體限制 128 mb 提交 5 解決 5 提交 狀態 討論版 命題人 150112200121 edit testdata 題目描述 n 個不同球放入 m個不同盒子,盒子不能為空,求有幾種放法 輸入 輸入兩個正整數n,m0 n,m 10 輸出 輸...
組合數學 8種盒子放球問題
這篇部落格總結一下下邊8種問題 1.有n個相同的球,k個不同的盒子,把n個球放到盒子裡,盒子不允許為空,有多少種方案。2.有n個相同的球,k個不同的盒子,把n個球放到盒子裡,盒子允許為空,有多少種方案。3.有n個相同的球,k個相同的盒子,把n個球放到盒子裡,盒子允許為空,有多少種方案。4.有n個相同...