2013长春现场赛的题,简单DP。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 50, maxs = 50000;
int s[maxn];
double dp[maxn][maxs];
int main()
{
int t;
for(scanf("%d", &t); t--;) {
int n;
double pos;
int temp = 1;
scanf("%d%lf", &n, &pos);
for(int i = 0; i < n; i++) {
scanf("%d", &s[i]);
temp += s[i];
}
for(int i = 0; i < n; i++)
for(int j = 0; j < temp; j++)
dp[i][j] = 0;
dp[0][0] = 0.5;
dp[0][s[0]] = 0.5;
for(int i = 1; i < n; i++) {
for(int j = 0; j < temp; j++) {
dp[i][j] = dp[i-1][j] * 0.5;
if(j - s[i] >= 0) dp[i][j] += dp[i-1][j-s[i]] * 0.5;///开始没加 if WA了。。。
}
}
double sum = 0;
n--;
for(int i = 0; i < temp; i++) {
sum += dp[n][i];
if(sum >= pos) {
printf("%d\n", i);
break;
}
}
}
return 0;
}