题意:要抢劫,但是抢每个银行都有被抓的概率,问在低于规定的被抓概率情况下最多能抢到多少钱。

输入:第一行为T,表示共T个测试例子。每个例子的第一行给出一个浮点数P,是规定被抓的概率上限。第一行还有一个整数N,是准备抢的N个银行。接下来有N行代表N个银行,每行是一个整数M和一个浮点数P。M表示此银行钱的数量,P劫此银行会被抓的概率。

输出:低于规定的被抓概率,能抢多少钱?

思路:

  注意到,这里的背包容量是概率!也就是浮点型,不适合作为容量。要找其他的背包容量才行。

  将被抓的概率转为安全的概率,安全概率=1-被抓概率,dp保存的是安全概率。将银行作为第1重for循环,也就是表示前 i 个银行可抢的情况下,怎么抢会更多而不被抓。将钱的数量作为第2重for循环,上限是每个银行的钱之和,下限是第i个银行里的钱。每次一更新dp[j]就代表着能抢得 j 钱的最大安全概率。这么说吧,背包的容量是所有银行的钱之和,价值是安全的概率。那dp数组应该开多少合适?还好HDU留个条生路,开dp[10000]就够了。最后怎么获取答案?答案并不在dp[]中了,dp[]中保存的是抢到j钱的安全概率。在理想情况下,此数组是按逆序有序的,抢得越多,安全概率越小,即越危险。实际上却要考虑最糟糕的情况。分析如下:

(1)假设每个银行里的钱最少为y,当y>1时,dp[1]到dp[y]的值在计算的前后都为0,这几个元素都不会被更新到,可在第13行找答案。

(2)假设钱多的银行,其安全概率更大。这不符合常理,但是还是得防一下。举例,第1个银行钱为1,安全概率0.7,第2个银行钱为2,安全概率为0.9,那么dp[0]=1,dp[1]=0.7,dp[2]=0.9,dp[3]=0.7*0.9。  dp里的值从1→0.7→0.9→0.63,也就是从大→小→大→小。如何找那个规定的安全概率?

(3)假设某个银行的钱为所有银行中最多,为x。那么dp[]数组中,下标大于x的在第1重for的每次循环都可能被更新一次,那么这段dp[]的值就不会出现0啦。可是会是逆序有序的吗?应该会吧!我还没证明!囧!理想会逆序有序,可是成功了。

 #include <iostream>
#define limit 110
using namespace std;
int n;
int money[limit]; //银行的钱
double safe[limit]; //被抓的概率
double dp[], p,big;;
void cal(int temp,int n)//所有银行的钱,n家银行
{
int i,j;
for(i=;i<n;i++)
for(j=temp;j>=money[i];j--) //j是当前银行的钱
{
big=dp[j-money[i]]*safe[i];
if( dp[j]<big ) dp[j]=big;
}
}
int main()
{
int t,i,temp;
scanf("%d",&t);
while(t--)
{
scanf("%lf %d",&p,&n);
temp=;
p=-p;
memset(dp,,sizeof(dp));
dp[]=1.0; //没抢到钱,安全概率为1
for(i=;i<n;i++)
{
scanf("%d %lf",&money[i],&safe[i]);
safe[i]=-safe[i]; //转安全概率
temp+=money[i];
}
cal(temp, n);
for(i=temp; i>=; i--)
if(dp[i]-p>0.0)//安全概率比要求的大
{
printf("%d\n",i);
break;
} }
return ;
}

AC代码

HDU 2955 Robberies抢劫案(01背包,变形)的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:一个抢劫犯要去抢劫银行,给出了几家银行的资金和被抓概率,要求在被抓概率不大于给出的被抓概率的情况下, ...

  2. HDU 2955 Robberies【01背包】

    解题思路:给出一个临界概率,在不超过这个概率的条件下,小偷最多能够偷到多少钱.因为对于每一个银行都只有偷与不偷两种选择,所以是01背包问题. 这里有一个小的转化,即为f[v]代表包内的钱数为v的时候, ...

  3. HDU 2955 Robberies (01背包,思路要转换一下,推荐!)

    题意: 小A要去抢劫银行,但是抢银行是有风险的,因此给出一个float值P,当被抓的概率<=p,他妈妈才让他去冒险. 给出一个n,接下来n行,分别给出一个Mj和Pj,表示第j个银行所拥有的钱,以 ...

  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 变形较大的01背包(有意思,新思路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 Robberies Time Limit: 2000/1000 MS (Java/Others) ...

  6. Hdu 2955 Robberies 0/1背包

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

  7. hdu 3466 Proud Merchants 01背包变形

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  8. HDU 3602 2012【01 背包变形】

    题意: 有 n 个团队和 m 艘船,每艘船的载客量为 k,每个团队的人数为ai+1 ,转载该团队可获利润 bi,要求每个团队的所有人必须在同一艘船上, 且团队优先级高的团队所在船编号不能大于优先级低的 ...

  9. hdu 2955(概率转化,01背包)

    Hot~~招聘——巴卡斯(杭州),壹晨仟阳(杭州),英雄互娱(杭州) (包括2016级新生)除了校赛,还有什么途径可以申请加入ACM校队? Robberies Time Limit: 2000/100 ...

随机推荐

  1. 【mysql格式化日期】

    date_format(now(),'%Y-%c-%d'): 1. DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. DATE_FORMAT(date,format) format ...

  2. UE4简单实现描边高亮效果

    材质文件下载地址: 链接:https://pan.baidu.com/s/10HUmXR_YNMOTF-Cg4ybuUg 提取码:m1my 1. 将材质文件放到Content目录中 2. 在项目中添加 ...

  3. JSONCPP学习笔记

    基本使用 使用jsoncpp库解析.修改.打印JSON串 源文件 $ cat main.cpp #include <iostream> #include "json/json.h ...

  4. Linux ifconfig-etho文件参数详解

    1.ifcfg-eth0文件参数详解 DEVICE 网卡名称/网络接口的名称BOOTPROTO 系统启动地址协议 常用参数: none:不使用启动地址协议,none禁止DHCP bootp:BOOTP ...

  5. PCB生产企业自动化立体仓库/智能仓库库系统WMS/WCS解决方案

    PCB生产企业自动化立体仓库/智能仓库库系统WMS/WCS解决方案 自动化立体仓库智能仓储系统WMS/WCS重要性调查 调查1(物流成本占总生产成本比例数据)1979年英国的第一次调查表明,在从原材料 ...

  6. MCP|WJ|Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex proximity extension assay(利用多重邻位延伸分析技术进行宫颈癌血浆蛋白候选生物标记物的鉴定研究)

    文献名:Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex pr ...

  7. Windows日志为什么要把它转成Syslog呢?

    有的朋友会问,好好的Windows日志为什么要把它转成Syslog呢?呵呵,当Windows服务器比较少的时候,我们是不需要这样做的.但试想如果你管理着成千上百台的Windows机器,你会一台一台的登 ...

  8. Filter的使用及其生命周期介绍

    一.Filter 1. Filter简介 > Filter翻译为中文是过滤器的意思. > Filter是JavaWeb的三大web组件之一:Servlet.Filter.Listener ...

  9. 关于STL库中的max min swap

    嗯...   不得不说c++中的STL库是一个神奇的东西   可以使你的代码显得更加简洁....   今天就只讲STL中的三个鬼畜:   max       min       swap   具体操作 ...

  10. Subversion Server Edge用户权限设置简介

    Subversion Server Edge用户权限可分为两种,一种为按用户权限,一种为按组权限设置 1.按用户设置权限 [codeLibrary:/] //对整个代码库 *=r     //所有用户 ...