Robberies
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 2 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem 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
Source
//把银行所有的钱作为一个背包
//状态方程是 bag[v]=max(bag[v],bag[v-value[i]]*(1-caught_rate[i]) )
//必须保证上次成功逃脱,所有要乘上次逃脱的概率
//bag[v] 表示 robber 偷了v块大洋后逃脱的最大概率
#include<iostream>
#include<cstring>
using namespace std;
double caught_rate[101],p,bag[10010]; //被抓的概率,要求总概率不超过p,
int value[101],sum;
int main(){
int t,n;
scanf("%d",&t);
while(t--){
memset(bag,0,sizeof(bag));
bag[0]=1; //什么都不偷那么逃脱的概率是1
sum=0; //所有银行的总值
scanf("%lf%d",&p,&n);
for(int i=1;i<=n;i++){
scanf("%d%lf",&value[i],&caught_rate[i]);
sum+=value[i];
}
for(int i=1;i<=n;i++)
for(int v=sum;v>=value[i];v--)
bag[v]=max(bag[v],bag[v-value[i]]*(1-caught_rate[i]) );
int i;
for( i=sum;i>0;i--)
if(bag[i]>=(1-p))
break;
printf("%d\n",i);
}
// system("pause");
return 0;
}