题目中所给的都是被抓的概率,我们要求的是不被抓时能获得的最大价值,转化一下
/********************
* Author:fisty
* Data:2014-11-6
* hdu2955
* 01背包
* *******************/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_N 11000
int main(){
int t;
scanf("%d", &t);
while(t--){
double dp[MAX_N], p[MAX_N]; //价值为j时不被抓的概率
int v[MAX_N], N;
double P;
int sum = 0;
memset(dp, 0, sizeof(dp));
scanf("%lf%d", &P, &N);
for(int i = 0;i < N; i++){
scanf("%d%lf", &v[i], &p[i]);
sum += v[i];
}
dp[0] = 1;
for(int i = 0;i < N; i++){
for(int j = sum; j >= v[i]; j--){
dp[j] = max(dp[j], dp[j-v[i]]*(1-p[i]));
}
}
for(int i = sum; i >= 0; i--){
if(dp[i] >= (1-P)){
printf("%d\n", i);
break;
}
}
}
return 0;
}