链接:点击打开链接
题意:给出N道题,和一个概率P,然后给出每道题对应的得分a[i],两个人来答题,一个人是每道题答对的概率为0.5,问另一个人至少要答多少分才能保证有P的概率不会失败
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
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;
}