链接:http://acm.hdu.edu.cn/showproblem.php?pid=5781
题意:
从ATM机里取钱,不提供查询余额的功能,只知道钱的上限K,每次都要取一定的钱Y,如果存款>=Y,就得到 Y元钱, 如果取的钱超过了余额,警告1次,求在最优策略下,取的钱上限是K,警告次数不超过W取钱次数期望最小是多少。
题解:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const double eps = 1e-7;
const int maxn = 2010;
const int mod = 1e9+7;
double dp[maxn][15];
double DP(int k, int w)
{
if(w<0)return INF;
if(k==0)return dp[k][w]=0.0;
if(dp[k][w]>eps)return dp[k][w];
dp[k][w]=INF;
for(int i=1; i<=k; ++i)
dp[k][w]=min(dp[k][w], 1.0*(k-i+1)/(k+1)*DP(k-i,w) + 1.0*i/(k+1)*DP(i-1,w-1) + 1);
return dp[k][w];
}
int main()
{
int k,w;
while(~scanf("%d%d",&k,&w))
{
w=min(w,13);
printf("%.6lf\n",DP(k,w));
}
return 0;
}
/*
*/