http://acm.split.hdu.edu.cn/showproblem.php?pid=5781
题意:
Alice要去取钱,可是她忘记有多少钱了,只知道在[0,k]的范围之内,她每次可以选择取y的钱,如果y超过了她的存款,那么就会警告,警告w次的话就会被抓走,问在最多警告w次的情况下取出钱的最小期望次数。
思路:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<int,int> pll; 14 const int INF = 0x3f3f3f3f; 15 const int maxn = 2000 + 5; 16 17 int k,w; 18 double dp[maxn][20]; 19 20 int main() 21 { 22 //freopen("in.txt","r",stdin); 23 for(int i=1;i<=2000;i++) dp[i][0]=INF; 24 for(int i=0;i<20;i++) dp[0][i]=0; 25 for(int i=1;i<maxn;i++) 26 { 27 for(int j=1;j<20;j++) 28 { 29 dp[i][j]=INF; 30 for(int k=1;k<=i;k++) 31 dp[i][j]=min(dp[i][j],(i-k+1.0)/(i+1)*dp[i-k][j]+k/(i+1.0)*dp[k-1][j-1]+1); 32 } 33 34 } 35 while(~scanf("%d%d",&k,&w)) 36 printf("%.6f ",dp[k][min(w,11)]); 37 return 0; 38 }