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 ;
}

最新文章

  1. Python基础(一)
  2. iOS开发-完整学习路线图
  3. thinkphp nginx配置
  4. php任何优化的方式下这样第个列表都是再次查询
  5. CSS之CSS hack
  6. mysql fetch 系列函数
  7. webpy,希望能多了解一些关于WSGI,PYTHON的WEB开发框架的事,也希望能进一步了解PYTHON
  8. 玩转Firefox侧栏
  9. Apple Mach-O Linker Warning 警告解决的方法
  10. MPQ Storm库 源代码分析 一个
  11. DB2_自动生成值
  12. Django在根据models生成数据库表时报错: __init__() missing 1 required positional argument: &#39;on_delete&#39;
  13. 一个关于finally和return的面试题
  14. Deepin 15.4 个性化设置
  15. 前端forEach在Array、map、set中的使用,weakset,weakmap
  16. centos7部署phpipam(ip管理系统)
  17. Java数据结构和算法(四)赫夫曼树
  18. 安装及使用Eclipse Maven插件的经验
  19. [JavaScript] 根据字符串宽度截取字符串
  20. Unknown picture file extension

热门文章

  1. ROS学习笔记一(ROS的catkin工作空间)
  2. Scala中的数组和集合操作
  3. Linux实验楼学习之二
  4. 提示&#39;HTTP消息不可读&#39;
  5. 验证 Googlebot (检查是否为真的Google机器人)
  6. X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)
  7. C#可扩展数组转变为String[]数组
  8. Qt事件过滤器和事件的发送
  9. 下载YouTube视频的方法
  10. hdu3511 Prison Break 圆的扫描线