【HDU 2955】Robberies(DP)
2016-07-06 10:33
302 查看
题意是给你抢劫每个银行可获得的钱m和被抓的概率p,求被抓的概率小于P,最多能抢多少钱。
01背包问题,体积是m,价值是p。
被抓的概率不是简单相加,而应该是1−Π(1−p[i])
DP:dp[i]表示抢到i元且不被抓的概率。
初始条件:dp[0]=1;
转移方程:dp[j]=max{dp[j],dp[j−m[i]]∗(1−p[i])}(j>=m[i])
01背包问题,体积是m,价值是p。
被抓的概率不是简单相加,而应该是1−Π(1−p[i])
DP:dp[i]表示抢到i元且不被抓的概率。
初始条件:dp[0]=1;
转移方程:dp[j]=max{dp[j],dp[j−m[i]]∗(1−p[i])}(j>=m[i])
#include<cstdio> #include<cstring> #include<algorithm> #define N 105 using namespace std; int t, n, m ; double P, p , dp[10200]; int main() { scanf("%d", &t); while(t--) { memset(dp, 0, sizeof dp); m[0] = 0; scanf("%lf %d", &P, &n); for(int i = 1; i <= n; i++) { scanf("%d %lf", &m[i], &p[i]); m[0] += m[i]; } dp[0] = 1; for(int i = 1; i <= n; i++) for(int j = m[0]; j >= m[i]; j--) dp[j] = max(dp[j], dp[j - m[i]] * (1 - p[i])); while(P<=1-dp[m[0]])m[0]--; printf("%d\n", m[0]); } }
相关文章推荐
- iOS UITableView(UIScrollView)滑动到底部的判断
- IOS如何替换电话号码中间4位为"-"符号
- Dubbo标签学习
- JavaEE第一天_html标签
- 快速排序算法在Swift编程中的几种代码实现示例
- windows和linux的路径分隔符问题
- IntelliJ上创建Tomcat + Jersey 工程
- Git 服务器搭建
- 【POJ 2250】Compromise(最长公共子序列LCS)
- Lambda表达式详解
- mysql5.7半自动同步设置
- /bin/bash^M:
- Oracle外键级联删除和级联更新
- HDU 5412 题解
- IOS 缓存清理
- Jmeter—1 安装
- 【URAL 1917】Titan Ruins: Deadly Accuracy(DP)
- 【POJ 1273】Drainage Ditches(网络流)
- 百度地图error code 162,坐标为[0.0,0.0]或者[4.9E-324,4.9E-324]
- 谈谈对通用的第三方工具库再封装的必要性