Robberies
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17723 Accepted Submission(s):
6544
Problem Description
The aspiring Roy the Robber has seen a lot of American
movies, and knows that the bad guys usually gets caught in the end, often
because they become too greedy. He has decided to work in the lucrative business
of bank robbery only for a short while, before retiring to a comfortable job at
a university.
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
The first line of input gives T, the number of cases.
For each scenario, the first line of input gives a floating point number P, the
probability Roy needs to be below, and an integer N, the number of banks he has
plans for. Then follow N lines, where line j gives an integer Mj and a floating
point number Pj .
Bank j contains Mj millions, and the probability of
getting caught from robbing it is Pj .
Output
For each test case, output a line with the maximum
number of millions he can expect to get while the probability of getting caught
is less than the limit set.
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
Recommend
gaojie | We have carefully selected several similar
problems for you: 2159 2844 1171 1864 1087
一道需要转换的01背包,可以将所用银行里的钱看作背包容量,每一家银行的钱看作重量,转换成计算满足条件的安全概率。
题意:一个强盗要去抢劫银行,对于每个银行来说,都有一个不被抓的概率p,和能抢劫到的钱数money,每个银行最多只可以被抢劫一次。问在不被抓的总概率P下,怎样得到最大价值的钱数。
附上代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int main() 6 { 7 int T,n,m,i,j; 8 double p; 9 int a[105]; 10 double b[105],dp[10005]; 11 scanf("%d",&T); 12 while(T--) 13 { 14 int sum=0; 15 scanf("%lf%d",&p,&n); 16 for(i=0; i<n; i++) 17 { 18 scanf("%d%lf",&a[i],&b[i]); 19 sum+=a[i]; //银行总共的钱看做背包容量 20 } 21 memset(dp,0,sizeof(dp)); 22 dp[0]=1; // 0 元钱的时候安全概率为1 23 for(i=0; i<n; i++) 24 for(j=sum; j>=a[i]; j--) 25 if(dp[j]<dp[j-a[i]]*(1.0-b[i])) //将被抓的概率转化为安全的概率, 26 dp[j]=dp[j-a[i]]*(1.0-b[i]); 27 for(i=sum;; i--) 28 if(dp[i]>1-p) //从背包最大容量开始循环,只要安全概率满足,则结束循环输出 29 break; 30 printf("%d\n",i); 31 } 32 return 0; 33 }