1. 程式人生 > >求n個骰子各點數和出現的概率-動態規劃

求n個骰子各點數和出現的概率-動態規劃

這幾天在看劍指offer的時候發現,求n個骰子個點數和這個問題是發現書中講的不是很清楚,於是查詢資料,覺得下面講的比較透徹,記錄如下:

題目:把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。

宣告思想非原創!只因動態規劃思想的使用很好,記下!

分析:動態規劃就是分階段考慮問題,給出變數,找出相鄰階段間的關係。具體定義給忘了。

1.現在變數有:骰子個數,點數和。當有k個骰子,點數和為n時,出現次數記為f(k,n)。那與k-1個骰子階段之間的關係是怎樣的?

2.當我有k-1個骰子時,再增加一個骰子,這個骰子的點數只可能為1、2、3、4、5或6。那k個骰子得到點數和為n的情況有:

(k-1,n-1):第k個骰子投了點數1

(k-1,n-2):第k個骰子投了點數2

(k-1,n-3):第k個骰子投了點數3

....

(k-1,n-6):第k個骰子投了點數6

在k-1個骰子的基礎上,再增加一個骰子出現點數和為n的結果只有這6種情況!

所以:f(k,n)=f(k-1,n-1)+f(k-1,n-2)+f(k-1,n-3)+f(k-1,n-4)+f(k-1,n-5)+f(k-1,n-6)

3.有1個骰子,f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1。

那程式碼就容易寫了,遞迴函式,返回和為n出現的次數。所有的和出現次數總和為6^n。