使用numpy,不论是否使用try except,系统都判别为运行错误
import numpy as np
n, m = map(int, input().split()) # 一共有n种印章,买了m个
# numpy创建25行25列二维数组
dp = np.zeros((25, 25), dtype=np.float64)
for i in range(1, m + 1):
for j in range(1, n + 1):
if i < j: # 买i个印章,收集够比i个多的种数,概率为零
dp[i, j] = 0
elif j == 1: # 买i个印章,收集够1种类型
dp[i, j] = (1 / n) ** (i - 1) # n * (1/n ** (i - 1))
else: # 买i张凑齐j种,第i张要么和之前凑齐的一样,即抽中前面j种中的一种的概率是j/n
# 要么不一样,即抽中前面j-1种之外(n-(j-1))中的一种的概率是(n-j+1)/n
# 以上两种概率分别要乘上dp[i-1,j]和dp[i-1,j-1]才能表示对应情况下的dp[i,j],然后相加才是完整的概率
dp[i, j] = dp[i - 1, j] * j / n + dp[i - 1, j - 1] * (n - j + 1) / n
rst = float(dp[m, n])
print('%.4f' % rst)
不使用numpy,不使用try except,系统判别为运行错误
dp = [[0 for i in range(25)] for i in range(25)]
n, m = map(int, input().split()) # 一共有n种印章,买了m个
for i in range(1, m + 1):
for j in range(1, n + 1):
if i < j: # 买i个印章,收集够比i个多的种数,概率为零
dp[i][j] = 0
elif j == 1: # 买i个印章,收集够1种类型
dp[i][j] = (1 / n) ** (i - 1) # n * (1/n ** (i - 1))
else: # 买i张凑齐j种,第i张要么和之前凑齐的一样,即抽中前面j种中的一种的概率是j/n
# 要么不一样,即抽中前面j-1种之外(n-(j-1))中的一种的概率是(n-j+1)/n
# 以上两种概率分别要乘上dp[i-1][j]和dp[i-1][j-1]才能表示对应情况下的dp[i][j],然后相加才是完整的概率
dp[i][j] = dp[i - 1][j] * j / n + dp[i - 1][j - 1] * (n - j + 1) / n
rst = float(dp[m][n])
print('%.4f' % rst)
不使用numpy,使用try except,系统判别通过
# 加try except
dp = [[0 for i in range(25)] for i in range(25)]
n, m = map(int, input().split()) # 一共有n种印章,买了m个
try:
for i in range(1, m + 1):
for j in range(1, n + 1):
if i < j: # 买i个印章,收集够比i个多的种数,概率为零
dp[i][j] = 0
elif j == 1: # 买i个印章,收集够1种类型
dp[i][j] = (1 / n) ** (i - 1) # n * (1/n ** (i - 1))
else: # 买i张凑齐j种,第i张要么和之前凑齐的一样,即抽中前面j种中的一种的概率是j/n
# 要么不一样,即抽中前面j-1种之外(n-(j-1))中的一种的概率是(n-j+1)/n
# 以上两种概率分别要乘上dp[i-1][j]和dp[i-1][j-1]才能表示对应情况下的dp[i][j],然后相加才是完整的概率
dp[i][j] = dp[i - 1][j] * j / n + dp[i - 1][j - 1] * (n - j + 1) / n
rst = float(dp[m][n])
print('%.4f' % rst)
except:
pass
参考:(33条消息) 印章(动态规划问题dp)_tianynnb的博客-CSDN博客(33条消息) 蓝桥杯试题 算法训练 印章 (dp&详解)_m0_58245389的博客-CSDN博客