• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python 印章代码附有

武飞扬头像
奋斗中的小宸宸
帮助1

1.题目

学新通

2.代码

  1.  
    #共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
  2.  
    n,m=map(int,input().split())
  3.  
    dp=[[0 for i in range(n 1)]for j in range(m 1)]
  4.  
    for i in range(1,m 1):
  5.  
    for j in range(1,n 1):
  6.  
    if(j>i):
  7.  
    dp[i][j]=0
  8.  
    elif(j==1):
  9.  
    dp[i][j]=pow(1/n,i-1)
  10.  
    else:
  11.  
    dp[i][j]=(dp[i-1][j])*(j*1.0/n) (dp[i-1][j-1])*((n-j 1)*1.0/n)
  12.  
    print('{:.4f}'.format(dp[m][n]))

3.代码解析

这个题我开始想的第一个方法是深搜,因为想着每一个都是选择的问题,没一次的选项都一样,但是发现如果每一次搜索的很多的话很费时间,而且去写代码的时候思路也不是很清晰。

后面按照蓝桥杯的提示说是dp(动规),因此换了方法。

首先按照输入n,m,这里是python蓝桥杯中常用的输入方法:

map(int,input().spilt),这里的map就是映射,将input().spilt切割后的数都用int函数转换为int型。

 *重点(别把上面的i和j和下面的i和j看反了):dp数组就是在初始已知的值中去考虑递进的状态

(1)j>i的情况,即当只买了i张,集赞到对应j张的概率,这是不可能的,因为为0。进行以下初始化

if(j>i):
    dp[i][j]=0

(2)j=1:的情况,即集赞到j的概率,这种情况下,一张就是需要的那张那个就概率为1/n

(3)其他情况,对于买了i张集赞到对应j张的概率=买了i-1张积攒 j 张的概率*(新的一次再一次选中j张中的一张的概率) 买了i-1张积攒 j-1 张的概率*(选中n张目标图中除去不在目标图j数目中的概率)

dp[i][j]=(dp[i-1][j])*(j*1.0/n) (dp[i-1][j-1])*((n-j 1)*1.0/n)

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjaege
系列文章
更多 icon
同类精品
更多 icon
继续加载