HDU 2955 Robberies(0-1背包)
2024-09-02 04:48:43
http://acm.hdu.edu.cn/showproblem.php?pid=2955
题意:一个抢劫犯要去抢劫银行,给出了几家银行的资金和被抓概率,要求在被抓概率不大于给出的被抓概率的情况下,计算出所能抢劫得到的最多资金。
思路:一开始把被抓概率当做背包容量来做,结果错了,很重要的一点就是逃脱概率的计算,不是简单的相加相减,而是在上一家银行抢劫时的逃脱概率再乘以这一次的逃脱概率。
举个例子:
三家银行的被抓概率为P1,P2,P3。那么去抢劫这三家银行的逃脱概率为(1-P1)*(1-P2)*(1-P3)。
我们把银行的资金作为背包容量,状态转移方程为dp[j] = max(dp[j] , dp[j-m[i]] * (1-p[i])),dp[j]表示在抢劫了j资金之后的最大逃脱概率。
最后我们只需要逆序遍历dp数组,一旦它的逃脱概率大于了给定的逃脱概率,那么此时的i值就是所能得到的最大资金。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int maxn = +; int n;
double dp[maxn];
double p;
double pi[maxn];
int sum;
int num[maxn]; int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
memset(dp, , sizeof(dp));
cin >> p >> n;
sum = ;
for (int i = ; i <= n; i++)
{
cin >> num[i] >> pi[i];
sum += num[i];
}
dp[] = ; //没抢时逃脱概率为1,这个不能漏
for (int i = ; i <= n; i++)
{
for (int j = sum; j >= num[i]; j--)
dp[j] = max(dp[j], dp[j - num[i]] * ( - pi[i]));
}
for (int i = sum; i >= ; i--)
{
if (dp[i] > ( - p))
{
cout << i << endl;
break;
}
}
}
return ;
}
最新文章
- Python基础(一)
- iOS开发-完整学习路线图
- thinkphp nginx配置
- php任何优化的方式下这样第个列表都是再次查询
- CSS之CSS hack
- mysql fetch 系列函数
- webpy,希望能多了解一些关于WSGI,PYTHON的WEB开发框架的事,也希望能进一步了解PYTHON
- 玩转Firefox侧栏
- Apple Mach-O Linker Warning 警告解决的方法
- MPQ Storm库 源代码分析 一个
- DB2_自动生成值
- Django在根据models生成数据库表时报错: __init__() missing 1 required positional argument: &#39;on_delete&#39;
- 一个关于finally和return的面试题
- Deepin 15.4 个性化设置
- 前端forEach在Array、map、set中的使用,weakset,weakmap
- centos7部署phpipam(ip管理系统)
- Java数据结构和算法(四)赫夫曼树
- 安装及使用Eclipse Maven插件的经验
- [JavaScript] 根据字符串宽度截取字符串
- Unknown picture file extension
热门文章
- ROS学习笔记一(ROS的catkin工作空间)
- Scala中的数组和集合操作
- Linux实验楼学习之二
- 提示&#39;HTTP消息不可读&#39;
- 验证 Googlebot (检查是否为真的Google机器人)
- X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)
- C#可扩展数组转变为String[]数组
- Qt事件过滤器和事件的发送
- 下载YouTube视频的方法
- hdu3511 Prison Break 圆的扫描线