劍指Offer(Python多種思路實現):把n個骰子扔在地上,所有骰子朝上一面的點數之和爲s。輸入n,打印出s的所有可能的值出現的概率。
面試60題
題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和爲s。輸入n,打印出s的所有可能的值出現的概率。
解決思路:
def dice_probability(n, val=6):
dp = [[0]*val*n for _ in range(n)]
dp[0][:val] = [1] * val # 初始化第一個骰子
for i in range(n-1): # 根據第i個骰子更新第i+1個骰子
for j in range(i, len(dp[i+1])):
# 第i+1個骰子和爲j(實際爲j+1,因爲數組下標從0開始)的次數,等於第i個
# 骰子j-1 ~ j-6次數的總和
dp[i+1][j] = sum([dp[i][j-k] for k in range(1, val+1)])
# 整理數據成爲dict,key表示和,value表示出現的次數
# count = {i+1: times for i, times in enumerate(dp[-1])}
# 計算概率
count = {i+1: round(float(times / (val**n)), 5)
for i, times in enumerate(dp[-1]) if times!=0}
return count