面試題43 n個骰子的點數

2021-07-23 12:17:13 字數 1780 閱讀 7983

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

分析:(1)基於遞迴的方法

可以將n個骰子分為兩堆,第一堆只有1個,第二個堆有n-1個,單獨的那乙個可能出現的1到6的點數,只需計算1到6的每一種和剩餘的n-1個骰子的和,再將n-1個骰子分為1個和n-2個,如此遞推,終止條件是最後只剩下乙個骰子。**中定義了6n-n+1長度的陣列,和為s的點數儲存在陣列的下標為s-n的位置。

(2)基於迴圈的方法

採用兩個陣列來儲存骰子的點數每乙個出現的次數,在一次迴圈中,第乙個陣列中第n個數字表示骰子和為n出現的次數,在下一次迴圈中,我們加上乙個新的骰子,此時和為n的骰子出現的次數應該為上一次迴圈中骰子和為n-1,n-2,n-3,n-4,n-5和n-6的次數的總和。例如當有2個骰子時

第乙個陣列:只有乙個骰子的情況下

sum12

3456

78910

1112次數1

1111

1000

000

第二個陣列:加了乙個骰子時,更新的資料**於第乙個陣列,例如和為7時,為第乙個陣列中和為6,5,4,3,2,1的次數的和,和為8,為第乙個陣列中和為7,6,5,4,3,2的和,得到5,以此類推。。。

sum123

4567

891011

12次數01

2345

6543

21

原始碼:/**

* 功能說明:n和骰子的和出現的概率

* 日期:2016-10-7

**/#includeusing namespace std;

int g_maxvalue = 6;

// ********************方法一********************

void probability(int number, int* pprobabilities);

void probability(int original, int current, int sum, int* pprobabilities);

void printprobability_solution1(int number)

delete pprobabilities;

}void probability(int number, int* pprobabilities)

void probability(int original, int current, int sum, int* pprobabilities)

else }

}// ********************方法二********************

void printprobability_solution2(int number)

int flag = 0;//計算交替標誌位,第二個陣列更新完更新第乙個陣列,交替進行

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

pprobabilities[flag][i] = 1;

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

flag = 1 - flag;

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

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

{ double ratio = (double)pprobabilities[flag][i] / total;

cout << i << " : " <

面試題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個骰子的狀態有關。可以一步步劃分來求,一般考慮設個數祖,乙個記錄當前是第多少個骰子,乙個記錄總和多少,還要記錄總和的概率,因此此處考慮設個二維陣列...

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

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。解法一 遞迴 玩過麻將的都知道,骰子一共6個面,每個面上都有乙個點數,對應的數字是1到6之間的乙個數字。所以,n個骰子的點數和的最小值為n,最大值為6n。因此,乙個直觀的思路就是定義乙個長度為6n n...