hdu2955 Robberies

转载请注明出处:http://blog.csdn.net/u012860063

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955

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

IDI Open 2009

Recommend

gaojie   |   We have carefully selected several similar problems for you:  1203 2159 2844 1087 1505

题意:

抢银行。抢每个银行被抓的几率为caught[],互为独立事件,在容忍上限内,抢最多的钱。

01背包,但需要改变一点。需要将能抢来的最多的钱最为背包容量

代码如下:

/*此题关键是找到背包的容量和价值*/
#include <cstdio>
#include <cstring>
#define N 10047
int M[N];
double P[N],f[N];
double max(double a,double b)
{
	if(a > b)
		return a;
	return b;
}
int main()
{
	double p;
	int T,n,i,j,sum;
	scanf("%d",&T);
	while(T--)
	{
		sum = 0;
		memset(f,0,sizeof(f));//要对数组进行初始化
		scanf("%lf%d",&p,&n);
		p =1-p;;//成功逃走的概率
		f[0] = 1;//未抢劫一分钱那么逃走的概率就为1
		for(i = 0 ; i < n ; i++)
		{
			scanf("%d%lf",&M[i],&P[i]);
			P[i] = 1-P[i];
			sum+=M[i];//算出银行总钱数
		}
		for(i = 0 ; i < n ; i++)
		{
			for(j = sum ; j >= M[i] ; j--)
			{
				f[j] = max(f[j],f[j-M[i]]*P[i]);
			}//这里的每次成功的概率需要进行乘法运算,因为是两次成功的概率所以是乘法
		}
		for(i = sum ; i >= 0 ; i--)
		{
			if(f[i] >= p)
				break;//找出可以成功逃走并且逃走概率不超过警戒值
		}
		printf("%d\n",i);
	}
	return 0;
}

hdu2955 Robberies,布布扣,bubuko.com

时间: 2024-08-06 15:36:30

hdu2955 Robberies的相关文章

01背包水题篇之 HDU2955——Robberies

原来是想dp[i],表示不被抓概率为i所能抢到的最大钱(概率1-100) 后来看了别人的博客是dp[i]表示抢了i钱最大的不被抓概率,嗯~,弱菜水题都刷不动. 那么状态转移方程就是 dp[i]=max(dp[i],dp[i-money]*p),初始化dp(0~maxn)为0,dp[0]=1(1毛钱都没抢你抓个毛线啊,哥是良民~) 又是贴代码环节~ <span style="font-size:18px;">#include<iostream> #include&

hdu-2955 Robberies

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,

hdu2955 Robberies (01背包)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 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 t

背包问题总结篇

1.混合了贪心思想的背包入门 nefu1028暑假计划 01背包 给定工作开始时间.完成时间.给的工资,工作不能重叠,求最大收益. 一维Dp表示截止到当前时间的最大收益,但是事先要对结构体按结束时间排序,防止前一状态没有值 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int dp[1005]; struct mon

【hdu2955】 Robberies 01背包

hdu2955 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:盗贼抢银行,给出n个银行,每个银行有一定的资金和抢劫后被抓的概率,在给定一个概率P,表示盗贼愿意冒险抢劫所能承受的最大被抓概率. 思路:首先用1减去被抓概率,得到安全概率.那抢劫了多家银行后的安全概率就是这些银行各自的安全概率连乘起来.其实是01背包的变种, dp[j] 表示获得金额 j 时的安全概率.这里用滚动数组,得方程  dp[j] = max(dp[j], dp[i-a[i

HDU 2955 Robberies 背包概率DP

A - Robberies Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2955 Appoint description: Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usu

HDU 2955 Robberies --01背包变形

这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即转化为01背包问题. 此时dp[v]表示抢劫到v块钱成功逃跑的概率,概率相乘. 最后从大到小枚举v,找出概率大于逃跑概率的最大v值,即为最大抢劫的金额. 代码: #include <iostream> #include <cstdio> #include <cstring>

hdu 2955 Robberies(01背包)

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

HDU2955 背包DP

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21310    Accepted Submission(s): 7885 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that