N 个小球放 M 个盒子问题汇总

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)

猜你喜欢

转载自blog.csdn.net/a40850273/article/details/104216227
今日推荐