题意:钱的范围是0-2000,最多可悲警告k次,问取出所有钱的次数期望。
分析:因为这个人足够聪明,所以她一定会每次折半取,所以这样的话最多也就给警告log次,该题也就是11。所以只需要枚举她可能的钱数和警告次数。怎么转移呢?
吐过取出k的钱之后没有警告,那么就转移到dp[i-k][j],如果给警告了,那么就说明钱最多为k-1块,转移到dp[k-1][j-1]。这又分别是多少概率呢?能取到k块,说明钱肯定大于k了,所以概率为(i-k+1)/(i+1)(因为可能有0块),反之就是(k)/(i+1),然后+1.当前消耗了一步。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double dp[2010][12];
void init()
{
for(int i=0;i<=2000;i++)
{
dp[i][0]=1e20;
}
for(int i=0;i<=11;i++)
dp[0][i]=0;
for(int i=1;i<=2000;i++)
{
for(int j=1;j<=11;j++)
{
double t=1e20;
for(int k=1;k<=i;k++)
{
t=min(t,dp[i-k][j]*(i-k+1.0)/(i+1.0)+dp[k-1][j-1]*k/(i+1.0)+1);
}
dp[i][j]=t;
}
}
}
int main()
{
init();
int k,w;
while(scanf("%d%d",&k,&w)!=EOF)
{
if(w>11)w=11;
printf("%.6lf\n",dp[k][w]);
}
return 0;
}