交GPT出了道题,但是……懂的都懂,大佬没事可以帮忙改改,回头想出个个人赛懒得自己想题了玄关
如下
你正在参加一个多骰子游戏。游戏规则如下:你有n颗x面骰子,每颗骰子上的面从1到x,表示投掷后出现的点数。你将分别投掷这n颗骰子,然后计算所有点数的和。如果和为某个特定的目标数,你将获得相应的奖金,否则你将获得0元。
编写一个C++程序,计算在这个多骰子游戏中的预期收益(即数学期望)。
数学期望是指在多次重复试验中,所得数值的平均值。对于本题,数学期望的计算公式为: [ E(X) = \sum_{i=n}^{nx} P(i) \times V(i) ] 其中 (i) 表示骰子点数之和, (P(i)) 表示和为 (i) 的概率, (V(i)) 表示和为 (i) 时对应的奖金。
输出一个实数,表示在多骰子游戏中的预期收益,保留两位小数。
2 6
0
0
0
0
0
0
0
10
20
30
40
50
60
70
80
90
100
110
120
35.00
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
// 计算n颗x面骰子的和的概率分布
vector<double> calculate_probabilities(int n, int x) {
vector<double> dp(n * x + 1, 0.0);
dp[0] = 1.0;
for (int i = 0; i < n; ++i) {
vector<double> new_dp(n * x + 1, 0.0);
for (int j = 0; j <= i * x; ++j) {
for (int k = 1; k <= x; ++k) {
new_dp[j + k] += dp[j] / x;
}
}
dp = new_dp;
}
return dp;
}
int main() {
int n, x;
cin >> n >> x;
vector<double> probabilities = calculate_probabilities(n, x);
vector<int> values(n * x + 1, 0);
for (int i = n; i <= n * x; ++i) {
cin >> values[i];
}
double expected_value = 0.0;
for (int i = n; i <= n * x; ++i) {
expected_value += probabilities[i] * values[i];
}
cout << fixed << setprecision(2) << expected_value << endl;
return 0;
}
calculate_probabilities函数使用动态规划计算n颗x面骰子的和的概率分布。
dp数组用于存储每个可能和的概率。new_dp中。n和每颗骰子的面数x,然后读取每个可能和的奖金值。通过上述方法,可以高效地计算出多颗骰子游戏中根据每次投掷和的期望收益。这个程序能处理较大规模的输入,并在合理时间内完成计算。