演算法系列 n個骰子的點數

2021-08-07 15:57:13 字數 1033 閱讀 7096

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

此題目解法很多,其中使用動態規劃法最好理解,**也比較簡潔

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

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

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

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

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

....

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

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

所以:dp(c,k)=dp(c-1,k-1)+dp(c-1,k-2)+dp(c-1,k-3)+dp(c-1,k-4)+dp(c-1,k-5)+dp(c-1,k-6)(注意當k<6時的處理越界問題)

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

因此狀態轉移方程為

dp[c][k]=sum(dp[c-1][k-m])(1<=m<=6&&mpublic

class solution

//統計結果,用分數表示

for (int k = n; k <= 6 * n; k++)

return result;

}public

static

void

main(string args)

}

計算結果

16

1/216,3/216,6/216,10/216,15/216,21/216,25/216,27/216,

27/216,25/216,21/216,15/216,10/216,6/216,3/216,1/216,

演算法 n個骰子的點數

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。leetcode 解題思路 迭代模擬每個情況下,概率的累加值。分成三重迴圈 第一層迴圈表示骰子...

n個骰子的點數

把n個骰子扔在地上,所有骰子朝上的一面的點數之和為s。輸入n,列印出s的所有可能的值和出現的概率。1 基於迴圈求骰子點數 2int g maxvalue 6 骰子的點數個數 3void printprobability int number number 為骰子個數49 int pprobabili...

n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。方法一 遞迴 思路 設n個骰子某次投擲點數和為s的出現次數是f n,s 那麼,f n,s 等於n 1個骰子投擲的點數和為s 1 s 2 s 3 s 4 s 5 s 6時的次數的總和 f n s f n...