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

输入:第一行为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啦。可是会是逆序有序的吗?应该会吧!我还没证明!囧!理想会逆序有序,可是成功了。

 1 #include <iostream>
 2 #define limit 110
 3 using namespace std;
 4 int n;
 5 int money[limit];    //银行的钱
 6 double safe[limit];    //被抓的概率
 7 double dp[10000], p,big;;
 8 void cal(int temp,int n)//所有银行的钱,n家银行
 9 {
10     int i,j;
11     for(i=0;i<n;i++)
12         for(j=temp;j>=money[i];j--)    //j是当前银行的钱
13         {
14             big=dp[j-money[i]]*safe[i];
15             if( dp[j]<big )    dp[j]=big;
16         }
17 }
18 int main()
19 {
20     int t,i,temp;
21     scanf("%d",&t);
22     while(t--)
23     {
24         scanf("%lf %d",&p,&n);
25         temp=0;
26         p=1-p;
27         memset(dp,0,sizeof(dp));
28         dp[0]=1.0;  //没抢到钱,安全概率为1
29         for(i=0;i<n;i++)
30         {
31             scanf("%d %lf",&money[i],&safe[i]);
32             safe[i]=1-safe[i];        //转安全概率
33             temp+=money[i];
34         }
35         cal(temp, n);
36         for(i=temp; i>=0; i--)
37             if(dp[i]-p>0.0)//安全概率比要求的大
38             {
39                 printf("%d\n",i);
40                 break;
41             }
42
43     }
44     return 0;
45 }

AC代码

转载于:https://www.cnblogs.com/xcw0754/p/4242828.html

HDU 2955 Robberies抢劫案(01背包,变形)相关推荐

  1. HDU 2546 饭卡 01背包变形

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  2. HD 2955 Robberies(0-1背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 Problem Description The aspiring Roy the Robber ...

  3. codeforce Gym 101102A Coins (01背包变形)

    01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...

  4. P1734 最大约数和 01背包变形

    传送门 思路:01背包变形题.将i看成重量,i的因子看成价值即可.背包自然是s. /** * From: * Qingdao Agricultural University * Created by ...

  5. HDU 2955 Robberies(概率DP,01背包)题解

    题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...

  6. HDU 3466 01背包变形

    给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...

  7. hdu 2184 01背包变形

    转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和fu ...

  8. HDU 2546 饭卡(01背包裸题)

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. HDU 5234 Happy birthday 01背包

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5234 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  10. 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 HDU - 2191(特殊01背包)

    悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 HDU - 2191 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市 ...

最新文章

  1. 负载均衡策略深入剖析
  2. Android学习笔记之ProgressDialog
  3. 超级实用且不花哨的js代码大全
  4. DNS无法解析IP_计算机网络-DNS
  5. java 读取 excel poi_java poi怎么获取excel单元格的内容?
  6. 张弥曼获“世界杰出女科学家奖”,她的贡献在哪你一定要知道!
  7. C# string转double,double转string
  8. C++学习系列笔记(八)
  9. 使用cppcheck检测代码警告、错误
  10. POJ 1459 Power Network
  11. phpcms根据二级栏目列表写的三级栏目列表
  12. 软件测试——JUnit基础
  13. 装机人员工具/解决局域网共享
  14. Pycharm---修改背景颜色和背景图片
  15. CentOS7下宽带连接
  16. diskpart命令_Windows Diskpart命令教程
  17. python调用百度地图、通过经纬度定位_python调用百度地图API得到两地经纬度计算直线距离...
  18. 如何高效管理自己的电脑?文件再多也不乱!
  19. 微信小程序云开发如何实现上传视频 以及 图片
  20. android修改虚拟内存(方法)

热门文章

  1. 美团知识图谱问答技术实践与探索
  2. 【GCN】2021年,我终于决定入门GCN
  3. bert之我见 - positional encoding
  4. 厉害了!这款百度炼丹神器绝了!
  5. 【论文解读】“推荐系统”加上“图神经网络”
  6. 达观杯文本智能处理挑战赛冠军解决方案
  7. ​我拿 12 年 36 套四级真题做了什么 ?
  8. 【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率!
  9. python—装饰器@lru_cache在递归中的使用
  10. TF2.0—tf.keras.losses.BinaryCrossentropy