hdoj2955 Robberies(01背包)

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2955

题意

有n家银行,每家银行有两个属性:钱数m,概率p,p表示抢这家银行被逮着的概率。有一个人想抢银行,他认为只要在他抢一些银行后,被逮着的概率(指抢完所有银行被逮着的概率)小于pm就可以抢,求这个人最多可以抢多少钱。

思路

01背包问题,这题要注意钱数是背包容量,成功逃走的概率为价值(如果反过来会发现代码没办法写,因为反过来数组dp下标为小数)。数组dp[i]表示在抢的钱数为i的情况下,成功逃走概率的最大值。求出成功逃走概率的最大值后,1-最大值即为被逮着概率的最小值,再拿最小值与pm比较即可。此外还要注意dp数组的初始化。

代码

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6
 7 const int N = 110;
 8 const int M = 100 * 100 + 10;
 9 double p[N];
10 int m[N];
11 double dp[M];
12
13 int main()
14 {
15     //freopen("hdoj2955.txt", "r", stdin);
16     int t, n;
17     double pm;
18     cin >> t;
19     while (t--)
20     {
21         int sum = 0;
22         cin >> pm >> n;
23         for (int i = 0; i < n; i++)
24         {
25             cin >> m[i] >> p[i];
26             p[i] = 1 - p[i];    //成功逃走的概率
27             sum += m[i];
28         }
29
30         memset(dp, 0, sizeof(dp));
31         dp[0] = 1;    //没有抢钱,成功逃走的概率为1
32         for (int i = 0; i < n; i++)
33         {
34             for (int j = sum; j >= m[i]; j--)
35                 dp[j] = max(dp[j], dp[j - m[i]] * p[i]);
36         }
37
38         for (int i = sum; i >= 0; i--)
39             if (1 - dp[i] < pm)
40             {
41                 cout << i << endl;
42                 break;
43             }
44     }
45     return 0;
46 }
时间: 2024-11-03 03:25:52

hdoj2955 Robberies(01背包)的相关文章

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): 11297    Accepted Submission(s): 4190 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that

【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 0-1背包/概率初始化

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

hdu 2955 Robberies (01背包好题)

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

Robberies 01背包变形 hdoj

在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包.不能讲物品i装入多次,也不能只装入物品的一部分.因此,该问题被称为0-1背包问题. 将小偷计划要偷的钱的总数作为背包的容量,然后每个银行的存款就作为各个物品的重量, 每个银行小偷的逃跑率就作为每个物品的价值,这样就转化为01背包问题了. 至于为什么不可以用题目给的被抓获的概率作为价值,是因为小偷被抓与否的计算方法, 不是将每个银行小偷被抓的概率相乘,概率论的基本知识,所以要以逃跑率作为价值. 定义数组 F[j]为偷到j万元的时候

HDU 2955 Robberies(01 背包)

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct Node { int m; double p; }; Node bank[200]; double dp[100000]; int main() { int t,n; double p; int i,j,k; scanf("%d",&am

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

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&

Robberies hdu 2955 01背包

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