N 个小球放 M 个盒子问题汇总
print('====== same balls, diff boxes, not allow zero ======')
print()
M, N = 10, 10
dp = [[0 for j in range(M+1)] for i in range(N+1)]
for i in range(1, M+1):
dp[1][i] = 1
for i in range(1, N+1):
dp[i][i] = 1
for i in range(2, N+1):
for j in range(i+1, M+1):
dp[i][j] = dp[i][j-1] + dp[i-1][j-1];
start = 5
for iM in range(start, M+1):
for iN in range(start, iM+1):
cal_rlt = 1
temp = 1
for i in range(2, iN):
temp *= i
for i in range(iM-iN+1, iM):
cal_rlt *= i
cal_rlt /= temp
sim_rlt = dp[iN][iM]
print('M: ', iM, 'N: ', iN)
print(" sim_rlt: ", sim_rlt, " check: ", sim_rlt == cal_rlt)
print(" cal_rlt: ", int(cal_rlt))
print()
print()
print('over!')
print('====== same balls, diff boxes, allow zero ======')
print()
M, N = 10, 10
dp = [[0 for j in range(M+1)] for i in range(N+1)]
for i in range(1, M+1):
dp[1][i] = 1
for i in range(1, N+1):
dp[i][0] = 1
for i in range(2, N+1):
for j in range(1, M+1):
dp[i][j] = dp[i-1][j] + dp[i][j-1];
start = 5
for iM in range(start, M+1):
for iN in range(start, N+1):
cal_rlt = 1
temp = 1
for i in range(2, iN):
temp *= i
for i in range(iM+1, iM+iN):
cal_rlt *= i
cal_rlt /= temp
sim_rlt = dp[iN][iM]
print('M: ', iM, 'N: ', iN)
print(" sim_rlt: ", sim_rlt, " check: ", sim_rlt == cal_rlt)
print(" cal_rlt: ", int(cal_rlt))
print()
print()
print('over!')
print('====== same balls, same boxes, not allow zero ======')
print()
M, N = 10, 10
dp = [[0 for j in range(M+1)] for i in range(N+1)]
for i in range(1, M+1):
dp[1][i] = 1
for i in range(1, N+1):
dp[i][i] = 1
for i in range(2, N+1):
for j in range(i+1, M+1):
for k in range(1, i+1):
if j - i >= k:
dp[i][j] += dp[k][j-i]
start = 3
for iM in range(start, M+1):
for iN in range(start, iM+1):
sim_rlt = dp[iN][iM]
print('M: ', iM, 'N: ', iN)
print(" sim_rlt: ", sim_rlt)
print()
print()
print('over!')
print('====== same balls, same boxes, allow zero ======')
print()
M, N = 10, 10
dp = [[0 for j in range(M+N+1)] for i in range(N+1)]
for i in range(1, M+N+1):
dp[1][i] = 1
for i in range(1, N+1):
dp[i][i] = 1
for i in range(2, N+1):
for j in range(i+1, M+N+1):
for k in range(1, i+1):
if j - i >= k:
dp[i][j] += dp[k][j-i]
start = 3
for iM in range(start, M+1):
for iN in range(start, N+1):
sim_rlt = dp[iN][iM+iN]
print('M: ', iM, 'N: ', iN)
print(" sim_rlt: ", sim_rlt)
print()
print()
print('over!')
print('====== diff balls, same boxes, not allow zero ======')
print()
corr_val = [[1],
[1,1],
[1,3,1],
[1,7,6,1],
[1,15,25,10,1],
[1,31,90,65,15,1],
[1,63,301,350,140,21,1],
[1,127,966,1701,1050,266,28,1],
[1,255,3025,7770,6951,2646,462,36,1]]
M, N = len(corr_val), len(corr_val[-1])
dp = [[0 for j in range(N+1)] for i in range(M+1)]
for i in range(1, M+1):
dp[i][1] = 1
for i in range(1, N+1):
dp[i][i] = 1
for i in range(3, M+1):
for j in range(2, i):
dp[i][j] = dp[i-1][j-1] + j*dp[i-1][j]
start = 1
for iM in range(start, M+1):
for iN in range(start, iM+1):
sim_rlt = dp[iM][iN]
corr_rlt = corr_val[iM-1][iN-1]
print('M: ', iM, 'N: ', iN)
print(" sim_rlt: ", sim_rlt, 'check: ', sim_rlt == corr_val[iM-1][iN-1])
print(" corr_rlt: ", corr_val[iM-1][iN-1])
print()
print()
print('over!')
print('====== diff balls, same boxes, allow zero ======')
print()
corr_val = [[1,1,1,1,1,1,1,1,1],
[1,2,2,2,2,2,2,2,2],
[1,4,5,5,5,5,5,5,5],
[1,8,14,15,15,15,15,15,15],
[1,16,41,51,52,52,52,52,52],
[1,32,122,187,202,203,203,203,203],
[1,64,365,715,855,876,877,877,877],
[1,128,1094,2795,3845,4111,4139,4140,4140],
[1,256,3281,11051,18002,20648,21110,21146,21147]]
M, N = len(corr_val), len(corr_val[-1])
dp = [[0 for j in range(N+1)] for i in range(M+1)]
for i in range(1, M+1):
dp[i][1] = 1
for i in range(1, N+1):
dp[i][i] = 1
for i in range(3, M+1):
for j in range(2, i):
dp[i][j] = dp[i-1][j-1] + j*dp[i-1][j]
dp2 = [[0 for j in range(N+1)] for i in range(M+1)]
for i in range(1, M+1):
dp2[i][1] = 1
for i in range(1, M+1):
for j in range(1, N+1):
dp2[i][j] = dp2[i][j-1] + dp[i][j]
start = 5
for iM in range(start, M+1):
for iN in range(start, N+1):
sim_rlt = dp2[iM][iN]
corr_rlt = corr_val[iM-1][iN-1]
print('M: ', iM, 'N: ', iN)
print(" sim_rlt: ", sim_rlt, 'check: ', sim_rlt == corr_val[iM-1][iN-1])
print(" corr_rlt: ", corr_val[iM-1][iN-1])
print()
print()
print('over!')
print('============= Two Kings =====================')
print()
import random
M = 54
N = 3
K1, K2 = 1, 2 # King representation
# calculate as formula
cal_rlt = 17/53
# calculate as simulation
import random
MCNT = 100000
sum = 0
for i in range(MCNT):
arr = [i for i in range(1, M+1)]
random.shuffle(arr)
pK1 = arr.index(K1)
pK2 = arr.index(K2)
if pK1//(M/N) == pK2//(M/N):
sum += 1
sim_rlt = sum / MCNT
print('cal_rlt: ', cal_rlt)
print('sim_rlt: ', sim_rlt)
import random
day = 365
N = 30
# calculate as formula
s = 1
for i in range(day, day - N, -1):
s *= i/day
cal_rlt = 1 - s
# calculate as simulation
import random
MCNT = 100000
sum = 0
for i in range(MCNT):
m = set()
for i in range(N):
val = random.randint(1, day)
if val in m:
sum += 1
break
m.add(val)
sim_rlt = sum / MCNT
print('cal_rlt: ', cal_rlt)
print('sim_rlt: ', sim_rlt)