HDU 2955 Robberies 01背包

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

HDU 2955  Robberies
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13774    Accepted Submission(s): 5068


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
 

= = 一开始想放大概率  但显然概率不一定是2位小数 = = 之后又想了一个dp[i]表示前i个银行的最大金额 c[i]为同步概率 最后发现这样损失了很多状态 - - 姿势不对

AC代码即为01背包 注意处理下精度  还有概率是less than 严格小于

//
//  HDU 2955 Robbery
//
//  Created by TaoSama on 2015-02-05
//  Copyright (c) 2014 TaoSama. All rights reserved.
//
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#define CLR(x) memset(x, 0, sizeof(x))

using namespace std;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-9;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;

int w[105];
double v[105], dp[N]; //dp[j]表示j钱数的最大概率

int main() {
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	ios_base::sync_with_stdio(0);
	int kase, n; cin >> kase;
	while(kase--) {
		memset(dp, 0, sizeof dp);
		double p; cin >> p >> n; p = 1 - p;
		int sum = 0;
		for(int i = 1; i <= n; ++i) {
			cin >> w[i] >> v[i];
			v[i] = 1 - v[i];
			sum += w[i];
		}
		dp[0] = 1; int ans = -INF;
		for(int i = 1; i <= n; ++i)
			for(int j = sum; j >= w[i]; --j)
				dp[j] = max(dp[j], dp[j - w[i]] * v[i]);

		for(int i = sum; i >= 0; --i)
			if(dp[i] - p > EPS) {
				ans = i;
				break;
			}
		cout << ans << endl;
	}
	return 0;
}


hdu2955 01背包 Robberies Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21964    Accepted Submission(s): 8108 Problem Description The aspiring Ro 阅读详情

相关推荐

hdu2955

给定一个被抓的概率p,还有一些银行

dezhonger的专栏 957

hdu 1541 树状数组简单

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define iinf 2000000000 #define linf 1000000000000000000LL #defin

Lawrence_Jang 601

hdu 2955 Robberies解题报告

/*题意:(01背包) Roy想要抢劫银行,每家银行多有一定的金额和被抓到的概率,知道Roy被抓的最大概率P, 求Roy在被抓的情况下,抢劫最多。 分析:被抓概率可以转换成安全概率,Roy的安全概率大于1-P时都是安全的。抢劫的金额为0时, 肯定是安全的,所以d[0]=1;其他金额初始为最危险的所以概率全为0; */ #include #include #include usin

小夥的博客 465

HDU2955 Robberies

题目链接实质是01背包问题,关键还是找出转移方程。 顺着题意做非常困难,需要转换思维,把最大风险指数改成最小逃跑所需指数,各银行的被抓指数也改成能逃跑的指数pi=1-pi,因此想要成功逃跑,总逃跑指数必须大于或等于最小逃跑所需指数,因为逃跑是独立事件,所以总逃跑指数=各逃跑成功指数相乘(我理解了好久才搞懂,可能也是我比较蠢的原因(┬_┬)重要!),在dp过程中设钱的数量为背包容量的大小 dp[j

blanKey的博客 544

HDU2955_Robberies01背包

Robberies 题目大意:有一个强盗要去几个银行偷盗,他既想多投点钱,又想尽量不被抓到。已知各个银行 的金钱数和被抓的概率,以及强盗能容忍的最大被抓概率。求他最多能偷到多少钱? 思路:背包问题,原先想的是把概率当做背包,在这个范围内最多能抢多少钱。 但是问题出在概率这里,一是因为概率是浮点数,用作背包必须扩大10^n倍来用。二是最大不 被抓概率不是简单的累加。二是p = (1-p1)(1-p2)(1-p3) 其中p为最大不被抓概率,p1,p2,p3 为各个银行被抓概率。 第二次想到把银行的钱当做背包,把

程序员充电站(itcharge) 3971

hdu 2955 Robberies(01背包)

hdu 2955 Robberies (01背包)

程序员的冷浪漫 764

hdu2955 Robberies01背包

01-背包问题

1635

hdu 2955Robberies(概率dp,也可以叫01背包变形)

hdu 2955Robberies(概率dp,也可以叫01背包变形) 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 ...

serendipity的博客 221

HDU 2955 Robberies(01背包)

题目链接:HDU 2955 Robberies 01背包。 题目中给的概率精度是两位的,但是不一定都是两位的,所以没法同乘一个常数使概率变成整数,然后以把概率当成背包。这道题应该把银行总钱量当成背包。 状态转移方程:f[j]=max(f[j],f[j-q[i].money]*q[i].v),f[j]表示抢j块大洋的最大的逃脱概率。 dp[0]赋值为1(没有抢银行肯定能跑),其余dp值赋为0

fobdddf的专栏 571

hdu 2955 Robberies 01背包

hdu 2955 Robberies 01背包

AAAry的博客 452

hdu 2955 Robberies 01背包 Java

hdu 2955 Robberies 这道题自己写得挺久,最坑的一点是自己一开始是用 StreamTokenizer 类读取的,但是一直错,后来用 Scanner 类读取就 accept 了,搞不懂。 解这道题有以下关键点: 第一:一开始想的是用概率来作为背包容量,但是概率是浮点数,所以只能用钱来作为背包容量。 第二:题目中给出的都是被抓的概率,概率之间应该是相乘而不是相加,与一般的01背包不一样。 第三:dp[0] 注意初始化为 1, 什么都不偷逃跑的概率为 1。 import java.io.IOExc

weixin_46621409的博客 158

hdu 2955 01 背包 Robberies

题意:        好多个银行,他们很有钱。有个人想去抢劫。告诉你银行的钱和抢这个银行被抓的概率。银行被你抢一次就会没钱。现在需要你满足的条件是被抓的概率小于他给的stand,问,最多能得到多少钱。 做题过程:       这是一道很有现实主义色彩,很实用的一道题。总共就n个银行,他们钱数就是背包的容量,每个银行只抢一次,由此看出是个01背包背包出的价值(概率)最大。开始我还以为要dp

Julyana_Lin_夜 739

HDU 2955——Robberies01背包变形】

题目传送门 抢劫方案最优问题,需要一个简单地转换,我们求的是不被抓的概率而非被抓的概率,各个银行的储蓄总和为背包容量,体积为单个银行的储蓄,价值为不被抓概率。 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g...

NIRVANA REBIRTH 607

hdu 2955 Robberies + LightOJ 1079 Just another Robbery (01背包 概率)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:有一个小偷要偷银行的钱,可是他偷没家银行总是有一定的概率被抓,现在给了你一个概率P,只要他被抓的概率乘积不大与P,他就是安全的。问你在他安全的情况下,他最多可以偷多少钱。 思路:01背包。所有银行的总资产为背包容量V。求最大的逃跑概率。 题目给出被抓的概率,要求最大的逃跑率,即1-p

whyorwhnt的专栏 1118

hdu 2955 Robberies (01背包

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 思路:一开始看急了,以为概率是直接相加的,wa了无数发,这道题目给的是被抓的概率,我们应该先求出总的逃跑概率,1-逃跑概率就是最后被抓的概率,dp的话,以所有银行总金额为容量,以单个银行的金额为体积,以逃跑的概率为价值,跑01背包,最后找一下小于被抓概率的最大金额。 实现代码: #incl...

weixin_30252155的博客 106

hdu2955 B - Robberies(01背包)

题目 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意 一个被抓概率pmax 一个要偷银行数n 以下n行 每行一个vi代表价值 一个pi代表被抓概率 在不超过pmax的情况下,最大化偷到的vi的价值 思路来源 https://blog.csdn.net/jianbagengmu/article/details/71091755 题...

小衣同学的博客 447

HDU2955 Robberies 一道01背包问题

HDU 2955 这一题,很有趣味。 首先,如果是按照照常的思路,在内层for循环,没办法遍历背包容量(概率),概率是double/float型的数据。 所以,将价值看成背包容量,在寻找可行的最大的价值时,将价值从大到小遍历,出现满足的概率条件时,便可以结束,此时的背包容量(价值),就是最终结果。 另外,注意,这么多银行中只要有一个银行抓住了他,就没有逃脱成功。 //HDU 2955...

117瓶果粒橙 280
上一篇: Binary Search, something about bounds.
下一篇: HDU 1864 最大报销额 01背包
TaoSama
博客等级 码龄15年 89粉丝 457原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值