题意: 小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背包,思路要转换一下,推荐!)的更多相关文章

  1. hdu 2955 Robberies (01背包)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 思路:一开始看急了,以为概率是直接相加的,wa了无数发,这道题目给的是被抓的概率,我们应该先求出总的 ...

  2. HDU 2955 Robberies(01背包变形)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. hdu 2955 Robberies 0-1背包/概率初始化

    /*Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. hdu 2955 Robberies (01背包好题)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. HDU——2955 Robberies (0-1背包)

    题意:有N个银行,每抢一个银行,可以获得\(v_i\)的前,但是会有\(p_i\)的概率被抓.现在要把被抓概率控制在\(P\)之下,求最多能抢到多少钱. 分析:0-1背包的变形,把重量变成了概率,因为 ...

  6. HDU 2955 Robberies --01背包变形

    这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即 ...

  7. HDU 2955 Robberies(01背包)

    Robberies Problem Description The aspiring Roy the Robber has seen a lot of American movies, and kno ...

  8. HDU 2955 【01背包/小数/概率DP】

    Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. HDOJ 2955 Robberies (01背包)

    10397780 2014-03-26 00:13:51 Accepted 2955 46MS 480K 676 B C++ 泽泽 http://acm.hdu.edu.cn/showproblem. ...

  10. HDOJ.2955 Robberies (01背包+概率问题)

    Robberies 算法学习-–动态规划初探 题意分析 有一个小偷去抢劫银行,给出来银行的个数n,和一个概率p为能够逃跑的临界概率,接下来有n行分别是这个银行所有拥有的钱数mi和抢劫后被抓的概率pi, ...

随机推荐

  1. 【转】Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败

    错误原因如下: Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot ...

  2. ref和out的区别

    ref类型参数是按地址传递,能改变原来的数值.使用ref传参前,变量必须赋值. 带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值. out类型参数 ...

  3. Python数学运算

    python中的加减乘除比其他的语言简单,不需要对其赋值变量 (1)加减乘除 ) #加法 ) #减法 ) #乘法 ) #除法 5.0 ) #乘方 (2)判断 判断返回的是True或者False ) # ...

  4. oracle 修改密码,解锁

    运行里面输入:sqlplus /nolog登录 connect sys/as sysdba修改密码:alter user sys identified by 密码; --(你的是change_on_i ...

  5. netlink+netfilter

    http://blog.chinaunix.net/uid-21768364-id-3618377.html

  6. 42.JTAG接口使用注意

    无论是客户反馈,还是自己亲身经历,USB-Blaster不能下载配置FPGA的情况时有出现.究其原因,大致有如下几条: 1. FPGA器件上的JTAG相关引脚出现故障: 2. USB-Blaster坏 ...

  7. P3408: [Usaco2009 Oct]Heat Wave 热浪

    水题,裸的最短路. ; type link=^node; node=record t,d:longint; f:link; end; var n,m,s,i,j,u,v,w,max:longint; ...

  8. java类中定义接口

    今天看到一个java类中定义了接口,写个备忘录,记录一下 package com.gxf.test; public class Test_interface { public interface sh ...

  9. “我爱淘”冲刺阶段Scrum站立会议5

    完成任务: 由于我们的思路做了些改变,重新设计了界面的布局. 计划任务: 实现数据库的链接,将页面布局完善. 遇到问题: 使用webservice对数据的提取

  10. 如何使用css和jquery控制文章标题字数?

    如何使用css控制文章标题字数? 最佳答案 控制文章标题字数,不是动态网页的专利,如果静态页面使用CSS样式,也可以实现相同的效果! 看这个例子,你们可以复制到记事本保存为HTML文件看效果! < ...