Description
For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
Input
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Output
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
Sample Input
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
Sample Output
2 4 6
思路:将被逮到的概率转换成安全概率, 计算物品总价值,在获取不同物品价值时所能达到的最大安全概率。
代码:
#include<stdio.h>
#include<string.h>
#define max(a, b)(a > b ? a : b)
#define N 210000
double d[N];
double w[N];
int v[N];
int main(void)
{
int i, j, t, n, sum;
double p;
scanf("%d", &t);
while(t--)
{
memset(d, 0, sizeof(d));
scanf("%lf %d", &p, &n);
p = 1 - p;//安全的最大概率。
sum = 0;
for(i = 0; i < n; i++)
{
scanf("%d%lf", &v[i], &w[i]);
w[i] = 1 - w[i];
sum += v[i];
}
d[0] = 1;
for(i = 0; i < n; i++)
for(j = sum; j >= v[i]; j--)
d[j] = max(d[j], d[j-v[i]]*w[i]);//在获取物品价值为j时所能达到的最大安全概率。
for(i = sum; i >= 0; i--)
if(d[i] - p > 0.0000000001)
{
printf("%d
", i);
break;
}
}
return 0;
}