码迷,mamicode.com
首页 > 其他好文 > 详细

n个骰子的点数之和

时间:2019-04-06 00:30:07      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:第一步   规划   概率   结果   排列   思路   总数   def   数字   

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。

解题思路:动态规划

第一步,确定问题解的表达式。可将f(n, s) 表示n个骰子点数的和为s的排列情况总数。
第二步,确定状态转移方程。n个骰子点数和为s的种类数只与n-1个骰子的和有关。因为一个骰子有六个点数,那么第n个骰子可能出现1到6的点数。所以第n个骰子点数为1的话,f(n,s)=f(n-1,s-1),当第n个骰子点数为2的话,f(n,s)=f(n-1,s-2),…,依次类推。在n-1个骰子的基础上,再增加一个骰子出现点数和为s的结果只有这6种情况!那么有:

f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6) 

上面就是状态转移方程,已知初始阶段的解为:
当n=1时, f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1。

代码如下:

#coding=utf8

def get_ans(n):

    dp = [[0 for i in range(6*n)] for i in range(n)]

 

    for i in range(6):

        dp[0][i] = 1

    # print dp

    for i in range(1,n):  #1,相当于2个骰子。

        for j in range(i,6*(i+1)):   #[0,i-1]的时候,频数为0(例如2个骰子不可能投出点数和为1)

            dp[i][j] = dp[i-1][j-6] + dp[i-1][j-5] +dp[i-1][j-4]+
                            dp[i - 1][j - 3] +dp[i-1][j-2] +dp[i-1][j-1]

 

    count = dp[n-1]

    return count  #算得骰子投出每一个点数的频数。再除以总的排列数即可得到频率

 

print get_ans(3)  #括号中的数字为骰子的个数。此代码为3个骰子时的情况。

 

n个骰子的点数之和

标签:第一步   规划   概率   结果   排列   思路   总数   def   数字   

原文地址:https://www.cnblogs.com/tsdblogs/p/10660392.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!