Robberies HDU

来源:互联网 发布:会计特点 知乎 编辑:程序博客网 时间:2024/06/05 20:05

题目传送门

题意:有一个小偷,和N家银行小偷如果被抓到的概率大于P以后就会被抓,每一家银行都有一个小偷能偷盗的金额和他被抓住的概率,问这个小偷在不被抓住的前提下能偷盗的最多的钱。

思路:01背包的变形,还是比较简单的,我们可以把能偷盗的钱的金额当作背包的容量,而不被抓到的概率当中价值然后直接01背包就好了。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <fstream>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <sstream>#include <stack>#include <string>#include <vector>#define MAXN 20100#define MAXE 5#define INF 1000000000#define MOD 1000000007#define LL long long#define pi acos(-1.0)using namespace std;int w[MAXN];double v[MAXN];double dp[MAXN];int main() {    std::ios::sync_with_stdio(false);    int T;    cin >> T;    for (int kase = 1; kase <= T; ++kase) {        double p, n;        cin >> p >> n;        p = 1 - p;        int sum = 0;        for (int i = 1; i <= n; ++i) {            cin >> w[i] >> v[i];            v[i] = 1 - v[i];            sum += w[i];        }        memset(dp, 0, sizeof(dp));        dp[0] = 1;        for (int i = 1; i <= n; ++i) {            for (int j = sum; j >= w[i]; --j) {                if (dp[j - w[i]] * v[i] - p >= -1e-8) {                    dp[j] = max(dp[j - w[i]] * v[i], dp[j]);                }            }        }        for (int i = sum; i >= 0; --i) {            if (dp[i] - p >= -1e-8) {                cout << i << endl;                break;            }        }    }    return 0;}
原创粉丝点击