题目:
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
题解:
使用两个数组存每次投的点数
1 void theProbability(const int &num)
2 {
3 if (num < 1)return ;
4 vector<vector<int>> theSum(2, vector<int>(6 * num + 1, 0));
5 int flag = 0;
6 for (int i = 1; i <= 6; ++i)theSum[flag][i] = 1;//第一次投,每个数的概率相同
7 for (int i = 2; i <= num; ++i)//骰子数
8 {
9 //for (int j = 0; j < i; ++j)theSum[1-flag][j] = 0;//前面投过的清零
10 for (int j = i; j <= 6 * i; ++j)
11 {
12 theSum[1 - flag][j] = 0;
13 for (int k = 1; k <= j && k <= 6; ++k)
14 theSum[1 - flag][j] += theSum[flag][j - k];
15 }
16 flag = 1 - flag;
17 }
18 for (int i = num; i <= num * 6; ++i)
19 cout << i << ": " << (double)theSum[flag][i] / (double)(pow(6.0, num)) << endl;
20 }
知识兔