算法提高 概率计算
时间限制:1.0s 内存限制:256.0MB
问题描述
生成n个∈[a,b]的随机整数,输出它们的和为x的概率。
输入格式
一行输入四个整数依次为n,a,b,x,用空格分隔。
输出格式
输出一行包含一个小数位和为x的概率,小数点后保留四位小数
样例输入
2 1 3 4
样例输出
0.3333
数据规模和约定
对于50%的数据,n≤5.
对于100%的数据,n≤100,b≤100.
分析:dp[x][n]代表由n个数组成x的概率。由于每次选择的概率和其他次选择的概率是相互独立的,因此可以得出递推公式:dp[x][n] = dp[x - i][n - 1] * dp[i][1], i ∈ [a, b]。最后输出dp[x][n]即可。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int n, a, b, x;
cin >> n >> a >> b >> x;
int maxN = b * n;
vector<vector<double> > dp(maxN + 1);
for (int i = 0; i < dp.size(); i++) {
dp[i].resize(n + 1);
}
for (int i = a; i <= b; i++) {
dp[i][1] = (double)1 / (b - a + 1);
}
for (int i = 2; i <= n; i++) {
for (int j = a * i; j <= b * i; j++) {
for (int k = a; k <= b; k++) {
if (j >= k) {
dp[j][i] += dp[k][1] * dp[j - k][i - 1];
}
}
}
}
printf("%.4lf\n", dp[x][n]);
return 0;
}