小偷偷银行的钱,给出每个银行能偷到的钱和被抓的概率,这题还是01背包,背包装的内容是不被抓的概率的最大值。从后往前扫找到最大的V使得dp[i]>p就是答案了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct point
{
int x;
double p;
};
double dp [10010];
point a[110];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double P;
int V,n;
scanf("%lf%d",&P,&n);
P = 1 - P;
V = 0;
for(int i = 1 ; i <= n ; i++)
{
scanf("%d%lf",&a[i].x,&a[i].p);
V += a[i].x;
a[i].p = 1 - a[i].p;
}
for(int i = 1 ; i <= V ; i++) dp[i] = 0;
dp[0] = 1;
for(int i = 1 ; i <= n ; i++)
{
for(int j = V ; j >= a[i].x ; j--)
{
dp[j] = max (dp[j],(dp[j-a[i].x]*a[i].p));
}
}
int max1 = 0;
for(int j = V ; j >= 0 ; j--)
{
if(dp[j] >= P)
{
max1 = j;
break;
}
}
printf("%d\n",max1);
}
return 0;
}