01背包.
题目中要求求出至少拿到一个offer的概率, 这样不好求, 那就求它的对立面, 即 拿不到任何一个offer的最小概率, 这样就可以转为01背包了.
#include <stdio.h>
#define MAX 10005
double dp[MAX], p[MAX];
int w[MAX];
inline double min(double a, double b) {
return a > b ? b : a;
}
int main() {
int n, v;
int i, j;
while (scanf("%d%d", &v, &n) == 2 && v || n) {
for (i = 0; i < MAX; i++) {
dp[i] = 1;
}
for (i = 1; i <= n; i++) {
scanf("%d%lf", &w[i], &p[i]);
}
for (i = 1; i <= n; i++) {
for (j = v; j >= w[i]; j--) {
dp[j] = min(dp[j], dp[j - w[i]]*(1 - p[i]));
}
}
printf("%.1lf%%\n", (1-dp[v])*100);
}
return 0;
}