算法提高 概率计算
时间限制: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.
分析:首先我们将区间[a, b]移动至以0为左端点的区间,即[0, t],其中t = b - a,相应的,和x也修正为S = x - na。我们设表示从[0, t]中选取i个数,其和为s的概率。于是递推关系式为
最终我们要求的就是。
#include <stdio.h>
int main()
{
int n, a, b, x, t, sum;
double f[105][5500] = { 0 };
scanf("%d %d %d %d", &n, &a, &b, &x);
t = b - a;
sum = x - n * a;
for (int s = 0; s <= t; ++s)
f[1][s] = 1.0 / (t + 1);
for (int i = 2; i <= n; ++i)
{
for (int s = 0; s <= sum; ++s)
{
f[i][s] = 0;
for (int j = 0; j <= t; ++j)
{
if (0 <= s - j && s - j <= sum)
f[i][s] += f[i-1][s-j] / (t + 1);
}
}
}
printf("%.4lf", f[n][sum]);
return 0;
}