1 /*UVA11427*/ 2 /*概率期望: 3 独立重复事件A(p,n): 4 p:一件事情发生的概率为p 5 n:最多重复n次 6 要求:1、q=成功次数/实验次数>p 结束实验; 7 所求:n次实验后,q一直小于等于p 8 9 初始思考: 10 ans=1-补集; 11 补集=p+(1-p)*p......这样不好控制,因为无法手动枚举出所有的情况 12 13 优化: 14 dp(i,j):发生i次实验,没有达成跳出条件,且发生了j次成功的概率 15 dp(i,j)=d(i-1,j-1)*p+dp(i-1,j)*(1-p) 满足j/i<=p; 16 p(A)=d(n,0)+d(n,1)+d(n,2)+d(n,3).....+d(n,i) i/n<=p 17 ans=1/p(A) 18 19 边界 : 20 memset(dp,0); 21 dp(0,0)=1; 22 23 24 */ 25 #include<iostream> 26 #include<stdio.h> 27 #include<string.h> 28 #include<algorithm> 29 #include<stdlib.h> 30 #include<math.h> 31 #include<queue> 32 #include<vector> 33 #include<map> 34 35 using namespace std; 36 37 double dp[105][105]; 38 int main() 39 { 40 int t,pi,pj,n; 41 double p; 42 cin>>t; 43 44 for(int cas=1;cas<=t; cas++) 45 { 46 scanf("%d/%d %d",&pi,&pj,&n); 47 p=(pi+0.0)/pj; 48 memset(dp,0,sizeof(dp)); 49 dp[0][0]=1.0; 50 for(int i=1;i<=n;i++) 51 { 52 for(int j=0;j*pj<=pi*i;j++)//保证j/i<=pi/pj,这是一种技巧 53 { 54 dp[i][j]=dp[i-1][j]*(1-p); 55 if(j-1>=0) dp[i][j]+=dp[i-1][j-1]*p; 56 } 57 } 58 double pAns=0; 59 for(int j=0;j*pj<=pi*n;j++) pAns+=dp[n][j]; 60 printf("Case #%d: %d ",cas,(int)(1/pAns)); 61 62 } 63 return 0; 64 }