其实就是一个递推式
求选牌的期望
double一个f[i][j]表示还剩i个红牌,j个黑牌
f[i][j]=i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1)
注意i>0时,前半部分成立,因为i=0时,i-1=-1 会re
同理j>0
!!!!!!!!!若f[i][j]<0 则把f[i][j]赋成0
因为f[i][j]<0还不如不选(此处的不选指一张都不选)
小窍门:可以直接-0.0000005以达成不四舍五入输出六位小数的目的
代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int a,b;
double f[5010][5010];
int main()
{
cin>>a>>b;
for(int i=0;i<=a;i++)
for(int j=0;j<=b;j++)
{
if(i>0) f[i][j]=1.0*i/(i+j)*(f[i-1][j]+1);
if(j>0) f[i][j]+=1.0*j/(i+j)*(f[i][j-1]-1);
if(f[i][j]<0) f[i][j]=0;
}
printf("%.6lf",f[a][b]-0.0000005);
}
原文:https://www.cnblogs.com/hzfeichang/p/14799459.html