码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2955 Robberies(01背包)

时间:2015-12-07 22:36:03      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

hdu 2955 Robberies(01背包)

标签:

原文地址:http://www.cnblogs.com/pshw/p/5027429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!