代码及解释
#include <cfloat>
#include <iostream>
#include <algorithm>
const int SIZE = 10010;
int m[SIZE];
double p[SIZE];
int main() {
int t;
std::cin >> t;
while (t--) {
int n;
double probability;
std::cin >> probability >> n;
probability = 1 - probability;
int sum = 0;
for (int i = 0; i<n; i++) {
std::cin >> m[i] >> p[i];
p[i] = 1 - p[i];
sum += m[i];
}
double f[SIZE] = { 1.0 };
for (int i = 0; i<n; i++)
for (int j = sum; j >= m[i]; j--)
f[j] = std::max(f[j], f[j - m[i]] * p[i]);
for (int i = sum; i >= 0; i--)
if (f[i] - probability > DBL_EPSILON) {
printf("%d\n", i);
break;
}
}
return 0;
}