43 n 個骰子的點數及出現的概率

2021-10-12 05:39:51 字數 1237 閱讀 1315

題目描述:把n 個骰子扔在地上,所有骰子朝上一面的點數之和為s,輸入n,列印

出s 的所有可能出現的概率

思路:遞迴一般是自頂向下的分析求解,而迴圈則是自底向上,占用更少的空間

和更少的時間,效能較好。定義乙個二維陣列,第一次擲骰子有 6 種可能,第一

個骰子投完的結果存到 probabilities[0];第二次開始擲骰子,在下一迴圈中,我們

加上乙個新骰子,此時和為 n 的骰子出現次數應該等於上一次迴圈中骰子點數和

為 n-1,n-2,n-3, n-4,n-5,n-6 的次數總和,所以我們把另乙個陣列的第 n 個數字設

為前乙個陣列對應 n-1,n-2,n-3,n-4,n-5,n-6 之和。

**實現:

public mapprintprobability(int number) 

int g_maxvalue = 6;

int probabilities = new int[2];

probabilities[0] = new int[g_maxvalue * number + 1];

probabilities[1] = new int[g_maxvalue * number + 1];

int flag = 0;

// 當第一次拋擲骰子時,有 6 種可能,每種可能出現一次

// 第乙個骰子投完的結果存到了 probabilities[0]

for (int i = 1; i <= g_maxvalue; i++)

//從第二次開始擲骰子,假設第乙個陣列中的第 n 個數字表示骰子和為 n 出現的次數,

for (int k = 2; k <= number; ++k)

// 第 k 次擲骰子,和最小為 k,最大為 g_maxvalue*k

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

} // 若 flag=0,1-flag 用的就是陣列 1,而 flag=1,1-flag 用的就是陣列 0

flag = 1 - flag;

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

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

return probabilitymap;

}

面試題43 n個骰子的點數

注意點 n 個骰子的面朝上點數和的範圍 n,6n 一共有6n n 1種可能 每個骰子的範圍 1,6 n 個骰子分為兩部分,第一骰子和其餘的n 1個骰子 遞迴的終止條件為當前其餘骰子個數為0個 include include include includeusing namespace std int...

面試題43 n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s所有可能的值出現的概率。該題是典型的動態規劃問題。n個骰子它的和顯然和前面n 1個骰子的狀態有關。可以一步步劃分來求,一般考慮設個數祖,乙個記錄當前是第多少個骰子,乙個記錄總和多少,還要記錄總和的概率,因此此處考慮設個二維陣列...

面試題43 n個骰子的點數

1.將n個骰子扔在地上,所有骰子朝上一面的點數之和為s,輸入n,列印出s的所有可能的值出現的概率。分析 1 基於遞迴的方法 可以將n個骰子分為兩堆,第一堆只有1個,第二個堆有n 1個,單獨的那乙個可能出現的1到6的點數,只需計算1到6的每一種和剩餘的n 1個骰子的和,再將n 1個骰子分為1個和n 2...