剑指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]