把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...