面試題43 n個骰子的點數

2021-07-03 19:36:41 字數 912 閱讀 5893

注意點:n 個骰子的面朝上點數和的範圍【n,6n】一共有6n-n+1種可能  每個骰子的範圍【1,6】    

n 個骰子分為兩部分,第一骰子和其餘的n-1個骰子 遞迴的終止條件為當前其餘骰子個數為0個

#include#include#include#includeusing namespace std;

int maxvalue=6;//骰子的最大點數

void probability(int n,int *probabilitys);

void probability(int originaln,int current,int sum,int *probabilitys);

void printprobability(int n)

int maxsum=n*maxvalue;

int *probabilitys=new int[maxsum-n+1];//統計每個點數出現的次數

for(int i=n;i<=maxsum;i++)

probability(n,probabilitys);//求n個骰子 面朝上各點數和 出現的次數

int total=pow(6,n);//n個骰子一共有多少中情況的排列

for(int i=n;i<=maxsum;i++)

delete probabilitys;

}void probability(int n,int *probabilitys)求n個骰子 面朝上各點數和 出現的次數

}void probability(int originaln,int current,int sum,int *probabilitys)//第乙個引數的作用其實就是儲存一開始骰子的個數

else

}} int main()

面試題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...

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

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