hdu4815 多少分能使获胜概率达到p?
n个题目,每一道都有对应的分值,猴子做对每道题目概率为0.5,老虎要做多少分能使获胜概率达到p?
dp[i][j]表示猴子在做完前i题得到j分的概率,则dp[n][i]表示做完n道题目得到j分的概率,这样求dp[n][i]的前缀和即为猴子得分在i及以下的概率了==
老虎要获胜概率达到p,那么只要看i最少多少能使前缀和>=p,得分为i
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 double dp[45][45*1005]; 6 int a[45]; 7 int main() 8 { 9 int T,n,i,j,sum; 10 double p; 11 scanf("%d",&T); 12 while (T--) 13 { 14 scanf("%d%lf",&n,&p); 15 sum=0; 16 memset(dp,0,sizeof(dp)); 17 for (i=1;i<=n;i++) 18 { 19 scanf("%d",&a[i]); 20 sum+=a[i]; 21 } 22 dp[0][0]=1.0; 23 for (i=1;i<=n;i++) 24 for (j=0;j<=sum;j++) 25 { 26 dp[i][j]=dp[i-1][j]*0.5; 27 if (j>=a[i]) dp[i][j]+=dp[i-1][j-a[i]]*0.5; 28 } 29 for (i=1;i<=sum;i++) dp[n][i]+=dp[n][i-1]; 30 for (i=0;i<=sum;i++) 31 if (dp[n][i]>=p) { 32 printf("%d\n",i); 33 break; 34 } 35 } 36 return 0; 37 }