60 n個骰子的點數概率

2021-10-03 20:33:26 字數 1112 閱讀 3624

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

你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。

示例 1:

輸入: 1

輸出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

示例 2:

輸入: 2

輸出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

解法一遞迴法,乙個骰子有6個面,n個骰子的和一共有6n-n+1個值,類似於貪婪法,將所有的和都計算一遍,並將出現的和記錄下來,組合一共有6^ n種,最後再將出現的計數除以6^n就是概率。

解法二:

使用動態規劃的方法(使用一維輔助陣列):

p[n] = p[n-1]+p[n-2]+p[n-3]+p[n-4]+p[n-5]+p[n-6]

以兩個骰子為例:

probability[i-1] = 0; // 注意將不可能得到的數歸零

}for(int j=n;j <= 6*n;j++)

probability[j] = probability[j] / pow(6,n);

return vector(probability.begin()+n,probability.end());}};

60 n個骰子的點數

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。解法一 遞迴。可以先把n個骰子分為兩堆 第一堆只有乙個 另一堆有n 1個。單獨的那個有可能出現1 6的點數。接下來問題轉化成1 6的每一種點數和剩下的n 1個骰子來計算點數和。接下來把n 1個骰子仍然分成兩...

60 n 個骰子的點數

lintcode 把 n 個骰子扔在地上,求點數和為 s 的概率。使用乙個二維陣列 dp 儲存點數出現的次數,其中 dp i j 表示前 i 個骰子產生點數 j 的次數。空間複雜度 o n2 public list dicessum int n 空間複雜度 o n public list dices...

劍指 Offer 題解 60 n 個骰子的點數

把n個骰子仍在地上,所有的骰子朝上的一面的點數之和為s,輸入n,列印出s所有可能的值出現的概率。乙個骰子的情況 input n 1output 1,0.17 2,0.17 3,0.17 4,0.17 5,0.17 6,0.17 兩個骰子的情況 input n 2output 2,0.03 3,0.0...