solution
d p [ i ] [ j ] = d p [ i ] [ j ] + d p [ i − 1 ] [ j ] ∗ 1 2 dp[i][j] = dp[i][j] + dp[i-1][j]*\frac{1}{2} dp[i][j]=dp[i][j]+dp[i−1][j]∗21
d p [ i ] [ j ] = d p [ i ] [ j ] + d p [ i − 1 ] [ j − v [ i ] ] ∗ 1 2 dp[i][j]=dp[i][j]+dp[i-1][j-v[i]]*\frac12 dp[i][j]=dp[i][j]+dp[i−1][j−v[i]]∗21
e p s = 1 e − 8 eps=1e^{-8} eps=1e−8 竟然WA了,改 e p s = 1 e − 6 eps=1e^{-6} eps=1e−6 A 了.
code
/*SiberianSquirrel*/
/*CuteKiloFish*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1), eps = 1e-6;
/*const int MOD = 998244353, r = 119, k = 23, g = 3;
const int MOD = 1004535809, r = 479, k = 21, g = 3;*/
const int INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const int M = 3e2 + 10, N = 5e6 + 10;
int sgn(double x) {
if(fabs(x) < eps) return 0;
return x < 0? -1: 1;
}
//inline int rnd(){static int seed=2333;return seed=(((seed*666666ll+20050818)%998244353)^1000000007)%1004535809;}
//double Rand() {return (double)rand() / RAND_MAX;}
int n, v[50], res;
double P, dp[50][50000];
void init() {res = 0, memset(dp, 0, sizeof dp), dp[0][0] = 1.0;}
void solve(double _p = 0) {
for(int i = 1; i <= n; ++ i) {
for(int j = 0; j <= res; ++ j) {
if(j >= v[i]) dp[i][j] += dp[i - 1][j - v[i]] / 2.0;
dp[i][j] += dp[i - 1][j] / 2.0;
}
}
for(int i = 0; i <= res; ++ i) {
_p += dp[n][i];
if(sgn(_p - P) >= 0) {
cout << i << endl;
return;
}
}
}
/*
8
23 0.0322581
270 284 924 622 650 861 571 326 655 543 703 212 735 361 456 559 576 82 80 394 187 26 358
25 0.0588235
334 320 268 799 600 849 823 103 785 36 12 428 745 871 526 870 913 550 749 396 22 156 972 907 235
29 0.5
795 183 161 45 810 638 52 708 888 961 895 269 137 227 885 691 17 369 46 436 758 864 275 614 399 479 209 311 715
20 0.0833333
12 33 719 814 256 168 252 968 450 704 262 759 539 251 771 595 700 87 319 129
15 0.125
261 275 208 145 126 230 927 539 171 918 50 634 236 717 157
39 0.03125
833 801 112 310 421 97 53 603 7 511 634 209 280 395 518 594 78 354 760 582 559 600 849 522 425 206 656 359 189 579 687 547 336 702 499 137 386 234 271
6 0.0454545
15 578 877 185 712 188
9 0.047619
701 298 693 864 730 838 886 559 485
2939
4210
6918
2752
1720
5605
185
1289
*/
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(nullptr);
// srand(time(0));
#ifdef ACM_LOCAL
freopen("input", "r", stdin);
freopen("output", "w", stdout);
#endif
int o = 1;
cin >> o;
while(o --) {
init();
cin >> n >> P;
for(int i = 1; i <= n; ++ i) {
cin >> v[i];
res += v[i];
}
solve();
}
return 0;
}