题意:可能在银行存着0~k元,不可查询余额,若取挫给予一次警告,警告不可超过w次,若采取最优取钱策略,问取钱次数的期望。
思路,令dp[i][j]表示存款(0~i)元,警告次数为j时的取钱总次数。
转移方程:dp[i][j]=min(dp[i-k][j]+dp[k-1][j-1]+i+1),其中1<=k<=i;
dp[i-k][j]表示取出k元没有被警告,dp[k-1][j-1]表示取k元时被警告,i+1表示0~i各取一次
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<sstream>
#include<iostream>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
int dp[2005][2005];
int main(){
// freopen("in.txt","r",stdin);
memset(dp,0x3f3f3f3f,sizeof(dp));
for(int i=0;i<2004;i++){
dp[0][i]=0;
}
for(int i=1;i<2005;i++){
for(int j=1;j<16;j++){
for(int k=1;k<=i;k++){
dp[i][j]=min(dp[i][j],dp[i-k][j]+dp[k-1][j-1]+i+1);
}
}
}
// printf("dp=%d\n",dp[2000][14]);
int k,w;
while(cin>>k>>w){
w=min(15,w);
double ans=(double)dp[k][w]*1.0/(k+1);
printf("%.6f\n",ans);
}
}