按照01 背包知道 概率应该作为背包 但是浮点型不能直接减, 所以转换下
将钱的总和作为背包 被抓的概率转换为不被抓的概率 作为价值;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
double dp[10050], c[110];
int v[110];
int main()
{
int t, sum;
scanf("%d", &t);
while(t--)
{
double q;
int n;
sum = 0;
scanf("%lf%d", &q, &n);
for(int i = 0; i < n; i++)
{
scanf("%d%lf", &v[i], &c[i]);
sum += v[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = 1.0;
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-c[i]));//抢劫j元不被抓的最大概率,
for(int j = sum; j >= 0; j--)
if(dp[j] >= 1-q)//p是被抓的概率,1-p是不被抓的概率。
{
printf("%d\n", j);
break;
}
}
return 0;
}