1.印章
问题描述
共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
输入格式
一行两个正整数n和m
输出格式
一个实数P表示答案,保留4位小数。
此题采用动态规划(Dynamic Programming,DP)的方法求解,动态规划的三要素:最优子结构、边界和状态转移函数。
最优子结构:每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到
边界:问题最小子子集的解(初始范围)
状态转移函数:从一个阶段向另一个阶段过度的具体形式,描述的是两个相邻子问题之间的关系(递推式)
参考博主
·设置状态:当前状态下的数据包含小A手里的印章数目、印章的种类数目,因此可以构建二维数组dp[i][j]来存储概率。令dp[i][j] = 小A手里的印章数目为i、印章的总种类数目为n时小A收集齐j种印章的概率。
#法1
n,m = map(int,input().split())
dp = [ [0 for i in range(25)] for j in range(25)]
for i in range(1,m+1):
for j in range(1,n+1):
if i < j:
dp[i][j] = 0
elif j == 1:
dp[i][j] = (1/n) ** (i-1)
else:
dp[i][j] = ( dp[i-1][j]) * (j*1.0/n) + (dp[i-1][j-1]) * (n-j