01背包 + 概率 之 hdu 2955
来源:互联网 发布:软件模拟计算热量传递 编辑:程序博客网 时间:2024/05/31 19:08
// [7/20/2014 Sjm]/*看到此题时,第一个想法是:以P作为体积,Pj作为费用,Mj作为价值。但是,double类型的不能作为数组下标,于是此法行不通。 于是,从另一角度考虑:被抓的概率不能超过上限,即不被抓的概率要大于下限(下限 = 1 - 被抓概率的上限)。以总的银行金额作为体积,每一个银行金额作为费用,不被抓的概率作为价值。即 dp[i][j] := 抢劫了前 i 个银行,所获金额至多为 j 的最大不被抓的概率。另外只有当每一个银行都没抓到 Roy 才可以。所以求概率时,要相乘。由此可求出答案。********注意********初始化时,dp[0] = 1,若不抢劫银行,则不被抓的概率为 1。*/
#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;const int MAX = 105;const int MAX_mil = 10005;struct node { int millions; double prb;};node arr[MAX];int sum;double P;int N;double dp[MAX_mil];int Solve(){ fill(dp, dp + sum + 1, 0); dp[0] = 1; for (int i = 1; i <= N; ++i) { for (int j = sum; j >= arr[i].millions; --j) { dp[j] = max(dp[j], dp[j - arr[i].millions] * arr[i].prb); } } for (int j = sum; j >= 0; --j) { if (dp[j] > P) { return j; } } return 0;}int main(){ //freopen("input.txt", "r", stdin); int T; scanf("%d", &T); while (T--) { sum = 0; scanf("%lf %d", &P, &N); P = 1 - P; for (int i = 1; i <= N; ++i) { scanf("%d %lf", &arr[i].millions, &arr[i].prb); arr[i].prb = 1 - arr[i].prb; sum += arr[i].millions; } printf("%d\n", Solve()); } return 0;}
0 0
- 01背包 + 概率 之 hdu 2955
- HDU-2955 Robberies 01背包 + 概率
- HDU 2955 Robberies(01背包+概率)
- HDU 2955|Robberies|01背包|概率
- HDU 2955 Robberies(经典01背包概率问题)
- HDU 2955 Robberies (转化概率-01背包)
- hdu 2955Robberies(01背包 概率计算)
- hdu 2955 Robberies(概率01背包,反向思维)
- 【HDU 2955 概率dp or(背包)】
- hdu 1203+2955【背包概率变形】
- hdu 1203 01背包求概率
- HDU 2995 Robberies 概率背包
- hdu 2955 Robberies + LightOJ 1079 Just another Robbery (01背包 概率)
- HDU 1203(I NEED A OFFER!)01背包+概率计算
- HDU 1203 I NEED A OFFER!(01背包+概率)
- HDOJ.2955 Robberies (01背包+概率问题)
- hdu 2602 背包问题之01背包
- 刷背包之01背包- HDU 2602
- 单片的双机通信
- 在linux下使用find命令查找某一个时间点以后创建或者修改的文件
- 网络基础知识
- 用宏定义写出swap(x,y)
- Akka 【五】 Example Of Handling Fault
- 01背包 + 概率 之 hdu 2955
- SOAP协议简介
- SOAP协议简介
- SOAP协议简介
- SOAP协议简介
- Linux gdb调试器用法全面解析
- SOAP协议简介
- SOAP协议简介
- SOAP协议简介