劍指offer n個骰子的點數(java)

2021-07-23 10:46:59 字數 1021 閱讀 4143

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

骰子一共6個面,每個面上都有乙個點數,對應的是1-6之間的乙個數字。所以n個骰子的點數和的最小值是n,最大值為6n.另外根據排列組合的知識,我們還知道n個骰子的所有點數的排列數為6^n.要解決這個問題,我們需要先統計出每乙個點數出現的次數,然後把每乙個點數出現的次數除以6^n,就能求出每個點數出現的概率。

解法一:基於遞迴求骰子的點數,時間效率不夠高

現在我們考慮如何統計每乙個點數出現的次數。要向求出n個骰子的點數和,可以先把n個骰子分為兩堆:第一堆只有乙個,另乙個有n-1個。單獨的那乙個有可能出現從1到6的點數。我們需要計算從1到6的每一種點數和剩下的n-1個骰子來計算點數和。接下來把剩下的n-1個骰子還是分成兩堆,第一堆只有乙個,第二堆有n-2個。我們把上一輪哪個單獨骰子的點數和這一輪單獨骰子的點數相加,再和n-2個骰子來計算點數和。分析到這裡,我們不難發現這是一種遞迴的思路,遞迴結束的條件就是最後只剩下乙個骰子。

我們可以定義乙個長度為6n-n+1的陣列儲存n個骰子的點數和,和為sum的點數出現的次數儲存到第sum-n個元素裡。

int g_maxvalue = 6;  

public void printprobability(int number)

delete pprobalities;

} public void probability(int number,int pprobabilities);

}public void probability(int original,int current,int sum,int pprobabilities)else

flag = 1 - flag;

} double total = math.pow(g_maxvalue, number);

for (int i = number; i <= g_maxvalue * number; i++)

}

劍指offer n個骰子的點數

思路 這裡可以用兩個陣列來儲存骰子點數的每個總數出現的次數。在一輪迴圈中,第乙個陣列中的第n個數字表示骰子的和為n出現的次數。在下一輪的迴圈中,加上乙個新的骰子,此時和為n的骰子出現的次數應該等於上一輪迴圈中骰子點數和為n 1,n 2,n 3,n 4,n 4,n 5與n 6次數的總和,所以把另外乙個...

面試題60 劍指offer n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。示例 輸入 n 2 輸出 解法 動態規劃規律 f n f n 1 f n 2 f n 3 f n 4 f n 5 f n 6 向已有的骰子中再加入乙個骰子,此時和為n出現的次數應為和為n 1,n 2,...

劍指Offer n個骰子扔出點數和S的概率

原文節選自 劍指offer 題目 把 n個骰子扔在地上,所有骰子朝上一面的點數之和為 s。輸入 n,列印出 s的所有可能的值出現的概率。分析 玩過麻將的都知道,骰子一共 6個面,每個面上都有乙個點數,對應的數字是1到 6之間的乙個數字。所以,n個骰子的點數和的最小值為 n,最大值為 6n。因此,乙個...