1. 程式人生 > >藍橋杯演算法提高——概率計算(概率dp)

藍橋杯演算法提高——概率計算(概率dp)

問題描述
  生成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; }