n个骰子的点数之和

Posted tanshoudong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n个骰子的点数之和相关的知识,希望对你有一定的参考价值。

题目:把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个骰子的点数之和的主要内容,如果未能解决你的问题,请参考以下文章

算法:n个骰子的点数

编程算法 - n个骰子的点数(递归) 代码(C)

n个骰子的点数

n 个骰子的点数

剑指60 n个骰子的点数

剑指Offer面试题43(Java版):n个骰子的点数