做法:运用条件期望即可。当吸血鬼的能力为x时
dp[x]=1+p[i]*dp[x+c[i]] {x<=c[i]}
dp[x]=t[i]*p[i];{x>c[i]}
注意有个小陷阱就是一开始吸血鬼的能力就比所有洞洞所需要的能力的和大的多的情况。
#include<cstdio>
#include<cstring>
#include<cmath>
#define max(a,b) a>b?a:b
const int LMT=20003;
const double is=0.5*(1+sqrt(5));
double dp[LMT];
int have[102];
int main()
{
int i,n,f,j,all;
while(~scanf("%d%d",&n,&f))
{
memset(dp,0,sizeof(dp));
all=-1;
for(i=0;i<n;i++)
{
scanf("%d",&have[i]);
all=max(all,have[i]);
}
all<<=1;
for(i=max(all,f);i>=f;i--)
{
for(j=0;j<n;j++)
if(i>have[j])dp[i]+=(int)(is*have[j]*have[j]);
else dp[i]+=1+dp[i+have[j]];
dp[i]/=n;
}
printf("%.3lf\n",dp[f]);
}
return 0;
}