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

2021-07-11 04:49:26 字數 916 閱讀 7713

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

思路:骰子六個點數,所以n個骰子出現的所有可能有6的n次方種。那麼這個問題我們專注於求點數和s可能出現的次數,概率相除就可以了。假設點數和為n,那麼最後一粒骰子可能出現1,2,3,4,5,6這六種可能,對於倒數第二顆骰子,如果在它之前的所有點數和為n-1,n-2,n-3,n-4,n-5,n-6,那麼最後的點數和就為n。把每個骰子看成一次迴圈,和為n的骰子出現的次數應該等於上一次迴圈中骰子點數和n-1,n-2,n-3,n-4,n-5,n-6的次數的總和。這樣倒推的方式似乎不好計算,那麼順推,從只有乙個骰子開始計算,它出現1~6每個點數的次數都是1,如果有兩個骰子,點數f(n) = f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)+f(n-6),把資料儲存在陣列中,那麼n個骰子應該有n行陣列。注意到當前點數和出現的次數只與上乙個陣列有關,因此可以簡化為用兩個陣列表示,每次交替的使用兩個陣列,乙個作為上一次的迴圈結果,乙個儲存當前迴圈的數字。

void printprobability(int number)

int flag = 0;

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

pprobabilities[flag][i] = 0;

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)

delete pprobabilities[0];

delete pprobabilities[1];

}

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

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

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