盒子與球問題的八種情況(Python實現)

2021-10-14 17:06:54 字數 4411 閱讀 2666

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個相同...