HDU 2955 Robberies (01背包,思路要转换一下,推荐!)
题意: 小A要去抢劫银行,但是抢银行是有风险的,因此给出一个float值P,当被抓的概率<=p,他妈妈才让他去冒险。
给出一个n,接下来n行,分别给出一个Mj和Pj,表示第j个银行所拥有的钱,以及抢劫该银行被抓的可能性。
注意:抢劫各个银行被抓的可能是独立事件!
思路: 由于被抓的可能性float型,而且不仅仅只有两位,float型精度一般小数点后6-7位,
假若将被捕可能性看做容量,开10^6的数组,WA;开10^7的数组,MLE。
因此若从一般的角度,即将被捕可能性转化成整数,看做容量,将抢劫的钱看作价值,是行不通的。
而且这样求被捕的概率也比较复杂。
这题的解法确实神!
将银行的钱数看做容量,对应的价值是每个银行不被捕的概率,这样我们就将题目转化成求最大的不被捕的概率值(但并不是求这个)。
用dp[j]表示偷到的钱为 j 时不被抓的概率,则状态转移方程为:
dp[j] = max(dp[j] , dp[j-money[i]] * pro[i]);
money[i]为第i个银行的钱,pro[i]=1-pi,即不被抓的概率。
由于是独立事件,所以要用累乘。
初始条件:dp[0]=1,dp[i]=0。
最终通过从总钱数递减找到第一个大于等于期望的不被捕概率(1-p)的背包,即为不被逮捕的所能抢到的最大钱数。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn=;
const int maxv=;
float dp[maxv]; //求最大的不被抓概率
float p; //被抓的概率要<=p
int n;
int sum; //银行的总钱数
int money[maxn];
float prob[maxn]; int main()
{
int t,val;
float pj;
scanf("%d",&t);
while(t--){
scanf("%f%d",&p,&n);
sum=;
for(int i=;i<=n;i++){
scanf("%d%f",&val,&pj);
sum+=val;
money[i]=val; //将银行里的钱当成容量
prob[i]=-pj; //将不被抓的可能性当成价值
}
memset(dp,,sizeof(dp));
dp[]=;
for(int i=;i<=n;i++){
for(int j=sum;j>=money[i];j--){
dp[j]=max(dp[j],dp[j-money[i]]*prob[i]);
}
}
int ans=; //别忘了初始为0
for(int i=sum;i>=;i--){
if(dp[i]>=-p){
ans=i;
break;
}
}
printf("%d\n",ans);
}
return ;
}
HDU 2955 Robberies (01背包,思路要转换一下,推荐!)的更多相关文章
- hdu 2955 Robberies (01背包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 思路:一开始看急了,以为概率是直接相加的,wa了无数发,这道题目给的是被抓的概率,我们应该先求出总的 ...
- HDU 2955 Robberies(01背包变形)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 2955 Robberies 0-1背包/概率初始化
/*Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu 2955 Robberies (01背包好题)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU——2955 Robberies (0-1背包)
题意:有N个银行,每抢一个银行,可以获得\(v_i\)的前,但是会有\(p_i\)的概率被抓.现在要把被抓概率控制在\(P\)之下,求最多能抢到多少钱. 分析:0-1背包的变形,把重量变成了概率,因为 ...
- HDU 2955 Robberies --01背包变形
这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即 ...
- HDU 2955 Robberies(01背包)
Robberies Problem Description The aspiring Roy the Robber has seen a lot of American movies, and kno ...
- HDU 2955 【01背包/小数/概率DP】
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDOJ 2955 Robberies (01背包)
10397780 2014-03-26 00:13:51 Accepted 2955 46MS 480K 676 B C++ 泽泽 http://acm.hdu.edu.cn/showproblem. ...
- HDOJ.2955 Robberies (01背包+概率问题)
Robberies 算法学习-–动态规划初探 题意分析 有一个小偷去抢劫银行,给出来银行的个数n,和一个概率p为能够逃跑的临界概率,接下来有n行分别是这个银行所有拥有的钱数mi和抢劫后被抓的概率pi, ...
随机推荐
- IOS笔记 : addChildViewController
一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这 些子ViewController只有一个是显示到父视图中的,可以通 ...
- Linux源代码情景分析读书笔记 物理页面的分配
函数 alloc_pages流程图
- DB2递归查询
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
- 在mac系统安装Apache Tomcat的详细步骤[转]
对于Apache Tomcat 估计很多童鞋都会,那么今天就简单说下在mac上进行tomcat的安装: 第一步:下载Tomcat 这里Himi下载的tomcat version:7.0.27 直接 ...
- 软件工程个人作业4(课堂练习&&课堂作业)
题目:返回一个整数数组中最大子数组的和. 要求:1.输入一个整型数组,数组里有正书和负数. 2.数组中连续的一个或者多个整数组,每个子数组都有一个和. 3.求所有子数组的和的最大值.要求时间复杂度为0 ...
- hdu 1548 A strange lift
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Description There is a strange li ...
- hdu 1113 Word Amalgamation
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1113 字符串简单题: stl水过 如下: #include<algorithm> #inc ...
- Hadoop之Hive UDAF TopN函数实现
public class GenericUDAFTopNRow extends AbstractGenericUDAFResolver { @Overridepublic GenericUDAFEva ...
- Xcode7免证书真机调试实践
1.Open Xcode7, click menu "Xcode-Preferences-accounts" to add your AppleId; 2.According to ...
- Android编程: ViewPager和Dialogs组件
学习内容:ViewPager和Dialogs组件 ====ViewPager组件==== 它的作用主要是支持屏幕左右滑动切换列表元素,使用方式如下: 1.首先定义ID号信息,创建res/values/ ...