HDU-2955-Robberies
Posted ydddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-2955-Robberies相关的知识,希望对你有一定的参考价值。
链接:https://vjudge.net/problem/HDU-2955#author=0
题意:
小偷去抢钱,每个银行有一定的钱和抢这个银行被抓的概率。
被抓概率有一个上限,在不超过这个概率的情况下能抢到的最大的钱是多少。
思路:
将被抓的概率转换为安全的概率。
dp[i] 表示,抢到i的钱的安全概率是多少。
01背包。
代码:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio> #include <math.h> using namespace std; typedef long long LL; const int MAXN = 1e4 + 10; double dp[MAXN]; int a[MAXN]; double b[MAXN]; int main() { int t; int n; double v; scanf("%d", &t); while (t--) { memset(dp, 0, sizeof(dp)); scanf("%lf%d", &v, &n); v = 1 - v; int sum = 0; for (int i = 1;i <= n;i++) { scanf("%d%lf", &a[i], &b[i]); sum += a[i]; b[i] = 1 - b[i];//安全概率 } dp[0] = 1.0; for (int i = 1;i <= n;i++) { for (int j = sum;j >= a[i];j--) dp[j] = max(dp[j], dp[j - a[i]] * b[i]); } for (int i = sum;i >= 0;i--) if (dp[i] >= v) { printf("%d ", i); break; } } return 0; }
以上是关于HDU-2955-Robberies的主要内容,如果未能解决你的问题,请参考以下文章