LINK
n n n个问题,每个问题有一定的分值
小 A A A随机选择答案
小 B B B想知道他至少得多少分,才能保证不输掉比赛的概率大于等于 p p p
其中 n < = 40 n<=40 n<=40
定义 f [ i ] [ j ] f[i][j] f[i][j]表示前 i i i题拿 j j j分的概率
…
直接推就好了,甚至没细节
找到一个最小的 x x x使得 ∑ i = 0 x f [ n ] [ i ] \sum\limits_{i=0}^{x} f[n][i] i=0∑xf[n][i]大于等于 p p p即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
double p,f[50][50009];
int n,a[maxn];
int main()
{
int t; cin >> t;
while( t-- )
{
cin >> n >> p;
for(int i=1;i<=n;i++) cin >> a[i];
f[0][0] = 1;
int sum = 0;
for(int i=1;i<=n;i++)
{
sum += a[i];
for(int j=0;j<=sum;j++)
{
f[i][j] = 0.5*f[i-1][j];//做错
//作对
if( j>=a[i] )
f[i][j] += 0.5*f[i-1][j-a[i]];
}
}
double ans = 0;
for(int i=0;;i++)
{
ans += f[n][i];
if( ans>=p )
{
cout << i << endl;
break;
}
}
sum = 0;
for(int i=1;i<=n;i++)
{
sum += a[i];
for(int j=0;j<=sum;j++) f[i][j] = 0;
}
}
}