藍橋杯演算法提高——概率計算(概率dp)
阿新 • • 發佈:2019-02-12
問題描述
生成n個∈[a,b]的隨機整數,輸出它們的和為x的概率。
輸入格式
一行輸入四個整數依次為n,a,b,x,用空格分隔。
輸出格式
輸出一行包含一個小數位和為x的概率,小數點後保留四位小數
樣例輸入
2 1 3 4
樣例輸出
0.3333
資料規模和約定
對於50%的資料,n≤5.
對於100%的資料,n≤100,b≤100.
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <set>
#include <math.h>
#include <algorithm>
#include <queue>
#include <iomanip>
#define INF 0x3f3f3f3f
#define MAXN 505
#define Mod 99999999
using namespace std;
double dp[110][10005]; //dp[i][j]選第i個數時和為j的概率
int main()
{
int n,a,b,x;
cin >>n>>a>>b>>x;
for(int i=a; i<=b; ++i)
dp[1][i]=1.0/(b-a+1);
for(int i=2; i<=n; ++i) //選第i個數
for(int k=a; k<=b; ++k) //這第i個數為k
for(int j=1; j<=x; ++j) //和為j
{
if(j>k)
dp[i][j]+=dp[i-1][j-k]/(b-a+1 );
}
printf("%.4lf\n",dp[n][x]);
return 0;
}