入门题,题意:有n种bug,有s个子系统,bug有无穷多个,一个人每天能找出一个bug,bug出现的概率一样即1/n,在子系统出现的概率也是一样的1/s,要求找出每种bug至少在每个子系统都出现的期望(天数)。
设dp[i][j]表示i种bug在j种子系统出现到目标状态所需的天数,那么有:
当找到一个bug时,有4种情况:
1、这种bug已经找到过,这种bug在j种子系统中出现过;
2、这种bug已经找到过,这种bug在j种子系统中没有出现过;
3、这种bug还没有找到过,这种bug在j种子系统中出现过;
4、这种bug还没有找到过,这种bug在j种子系统中没有出现过;
于是有:
dp[i][j]=i*1/n*j*1/s*dp[i][j]+i*1/n*(s-j)*1/s*dp[i][j+1]+(n-i)*1/n*j*1/s*dp[i+1][j]+(n-i)*1/n*(s-j)*1/s*dp[I+1][j+1]+1;
化简得:
dp[i][j]=(i*1/n*(s-j)*1/s*dp[i][j+1]+(n-i)*1/n*j*1/s*dp[i+1][j]+(n-i)*1/n*(s-j)*1/s*dp[I+1][j+1]+1)/(1-i*1/n*j*1/s);
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
const int inf=0x7ffffff;
const double PI=acos(-1.0);
const double eps=1e-8;
const double e=2.7182818284590452354;
double dp[1010][1010];
int main()
{
int n,s;
while(~scanf("%d%d",&n,&s))
{
mm(dp,0);
double p1=1.0/s;
double p2=1.0/n;
for(int i=n;i>=0;i--)
for(int j=s;j>=0;j--)
{
if(i==n && j==s) continue;
dp[i][j]=(i*p1*(s-j)*p2*dp[i][j+1]
+(n-i)*p1*j*p2*dp[i+1][j]
+(n-i)*p1*(s-j)*p2*dp[i+1][j+1]+1)/(1-i*p1*j*p2);
}
printf("%.4lf\n",dp[0][0]);
}
return 0;
}