Robberies
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21042 Accepted Submission(s): 7805
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.
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
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.
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
2 4 6
抢银行时是同时抢而不是一个一个抢,所以概率是相乘。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1000010;
const int M = 10010;
const double inf = 0x3f3f3f3f;
int v[N];
double dp[N], w[N] ;
int main()
{
int n, t, ans;
double s;
scanf("%d", &t);
while(t--)
{
scanf("%lf %d",&s, &n);
s=1-s, ans=0;
for(int i=0; i<n; i++)
{
scanf("%d %lf", &v[i], &w[i]);
w[i]=1-w[i], ans+=v[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0; i<n; i++)
{
for(int j=M;j>=v[i];j--)
{
dp[j]=max(dp[j-v[i]]*w[i], dp[j]);
}
}
for(int i=ans;i>=0;i--)
{
if(dp[i]>s)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}