n个骰子的和

剑指Offer:面试题43

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。求s的所有可能值出现的次数。

比如扔两个骰子,s的可能值为2-12,出现的次数分别为:1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1

Solution

# 在一次循环中,一个数组中的第n个元素表示骰子和为n出现的次数。
# 在下一次循环中,加上一个新的骰子,此时和为n出现的次数等于上一次和为n-1,n-2 ...,n-6出现的次数之和,
# 所以把另一个数组中的第n个元素设为前一个数组的第n-1,n-2 ...,n-6个元素之和。

def sumOfS(number, maxValue): # number: 总共骰子数, maxValue: 每个骰子的最大点数
    if number < 1:
        return None
    res = [[0 for i in range(maxValue * number + 1)],[0 for j in range(maxValue * number + 1)]]
    flag = 0
    for i in range(1, maxValue + 1):
        res[flag][i] = 1
    for k in range(2, number + 1):  # 当有k个骰子的情况
        for i in range(k):
            res[1-flag][i] = 0  # 小于k的位置置0
        for i in range(k, maxValue * k + 1):
            res[1-flag][i] = 0
            j = 1
            while j <= i and j <= maxValue:
                res[1-flag][i] += res[flag][i-j]
                j += 1
        flag = 1 - flag
    return res[flag]
posted @ 2016-12-05 13:47  BinWone  阅读(195)  评论(0编辑  收藏  举报