题目链接:https://cn.vjudge.net/problem/HDU-2955

题意

突然想找几个银行抢钱。

给出各银行的钱数和被抓的概率,以及能容忍的最大被抓概率。

问他最多能抢到多少钱?

思路

很好的一道题,受益良多。

  1. 代价是浮点数,不易存储计算。

    考虑到背包函数dp[cost]=val是个单调的,理论上自变量和因变量没有区别,可以位置互换。

    这样有函数: $ dp^-1[val]=cost $
  2. 可以发现本题代价的计算不是简单的加法,而是乘法关系。

    如果令dp为被抓的概率,有:dp[j]=max(dp[j], (1-dp[j-val[i]])cost[i]);

    但这样的边界难以给定

    如果令dp为逃脱的概率,有:dp[j]=max(dp[j], dp[j-val[i]]
    (1-cost[i]));

    边界即为dp[0]=1

    最后的输出解只需由大到小查dp数组即可,详细见代码。

提交过程

WA 变量没有互换,只是简单的把浮点数乘因子,转成整数

AC

代码

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn=1e5+20;
  7. const double eps=1e-8;
  8. double cost[maxn], total, dp[maxn];
  9. int val[maxn], n;
  10. bool equal(double a, double b){
  11. return (a-b)<eps && (b-a)<eps;
  12. }
  13. int main(void){
  14. int T;
  15. scanf("%d", &T);
  16. while (T--){
  17. scanf("%lf%d", &total, &n);
  18. int sumval=0;
  19. for (int i=1; i<=n; i++){
  20. scanf("%d%lf", &val[i], &cost[i]);
  21. sumval+=val[i];
  22. }
  23. for (int i=0; i<=sumval; i++) dp[i]=0;
  24. dp[0]=1;
  25. for (int i=1; i<=n; i++){
  26. for (int j=sumval; j>=val[i]; j--)
  27. dp[j]=max(dp[j], dp[j-val[i]]*(1-cost[i]));
  28. }
  29. int ans;
  30. for (int i=sumval; i>=0; i--)
  31. if (1-dp[i]<total || equal(1-dp[i], total)){
  32. ans=i; break;
  33. }
  34. printf("%d\n", ans);
  35. }
  36. return 0;
  37. }
Time Memory Length Lang Submitted
31ms 1292kB 935 G++ 2018-08-20 21:48:58

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 2955(概率转化,01背包)

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

  8. hdu 2955 Robberies(概率背包)

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

  9. hdu 2955 Robberies (01背包)

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

随机推荐

  1. k8s的概念

    Kubernetes(简称为 K8s),最初由 Google 的工程师开发和设计.Kubernetes 是用于自动部署.扩展和管理容器化应用程序的开源系统,它旨在提供跨主机集群的自动部署.扩展以及运行 ...

  2. MySQL 获取无限级某级的全路径

    传递参数:文件夹ID DROP FUNCTION IF EXISTS RecursionFolderFullPath; CREATE FUNCTION RecursionFolderFullPath( ...

  3. PHP 使用 Kafka 安装拾遗

    最近项目开发中需要使用 Kafka 消息队列.经过检索,PHP下面有通用的两种方式来调用 Kafka . php-rdkafka 扩展 以 PHP 扩展的形式进行使用是非常高效的.另外,该项目也提供了 ...

  4. Linux设备驱动--块设备(二)之相关结构体(转)

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  5. Python智能提示--提示对象内涵成员

    1. demo展示 2. 提示效果

  6. (2)Spring Boot返回json数据【从零开始学Spring Boot】

    在做如下操作之前,我们对之前的Hello进行简单的修改,我们新建一个包com.kfit.test.web 然后新建一个类HelloControoler, 然后修改App.java类,主要是的这个类就是 ...

  7. ASP.NET-signalR学习笔记

  8. 双向链表的实现与操作(C语言实现)

    双向链表也叫双链表,是链表的一种,它的每一个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的随意一个结点開始,都能够非常方便地訪问它的前驱结点和后继结点. 单链表的局限 1.单 ...

  9. centos6安装eclipse

    1. 下载eclipse 我下载的是eclipse-jee-juno-SR2-linux-gtk-x86_64.tar.gz 能够在http://www.eclipse.org/downloads/处 ...

  10. uva是崩了 吗,还是我太年轻?

    刚刚提交了一道题,发现提交状态一直是in judge queue,去提交状态那里看了下,排在我20分钟前的也在in judge queue,不知道前面还有多少.顿时感到好无力......