链接:点击打开链接 题意:给出N道题,和一个概率P,然后给出每道题对应的得分a[i],两个人来答题,一个人是每道题答对的概率为0.5,问另一个人至少要答多少分才能保证有P的概率不会失败 代码: [cpp] view plain copy long long v[45],dp[40005]; int main(){ double p; long long t,n,i,j,tmp,sum; scanf("%I64d",&t); while(t--){ scanf("%I64d%lf",&n,&p); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) scanf("%I64d",&v[i]); dp[0]=1; for(i=0;i<n;i++){ //因为每道题概率是0.5 for(j=40000;j>=v[i];j--) //因此只要处理出得分出 dp[j]+=dp[j-v[i]]; //现的次数即可 } sum=0,tmp=1ll<<n; //注意1变为LL for(i=0;i<=40000;i++){ sum+=dp[i]; if(sum*1.0/tmp>=p) break; } printf("%I64d\n",i); } return 0; }