zoukankan      html  css  js  c++  java
  • Robberies HDU 2955

    直接说题意吧。(什么网友bb了半天题都说不清楚)

    给了  P  表示大于这个概率一定被抓住。则P表示被抓住的概率。N表示现在有的银行,pi表示被抓的概率嘛。

    然后,就看数学了。肯定不能算被抓的概率啊。因为,如果你第一个就被抓了,后面的概率还用算吗,或则说,这样的计算不符合01

    背包的特点,那么我们就想一下,作为一个背包的容量,应该是做加减法,而不是像概率那样做乘除啊。那么我们就用银行的价值作为

    物体的体积,而概率(1-被抓的概率=逃跑的概率)作为物品的价值啊。为什么转化为逃跑的概率呢?因为正面肛不动啊!这样我们就得到了

    价值从小到大的一系列背包啊,不过概率也是递减的(抢的银行越多,逃跑的概率越小啊),当我们找到第一个小于(1-P)也是就是他自己的极限逃跑概率时,在之间的价值中找个最大的就可以了

    ac代码如下:

    #include<cstdio>
    #include<cstring>
    #define max(a, b) (a)>(b)?(a):(b)
    #define MAXN int(1e4)
    double dp[MAXN + 20], p[MAXN];
    int w[MAXN];
    int main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            memset(dp, 0, sizeof(dp));
            double pp;            int n, v=0;
            scanf("%lf%d", &pp, &n);
            for (int i = 1; i <= n; ++i)
            {
                scanf("%d%lf", &w[i], &p[i]);
                v += w[i];
            }
            dp[0] = 1;
            for (int i = 1; i <= n; ++i)
            for (int j = v; j >= w[i]; --j)
                dp[j] = max(dp[j], dp[j - w[i]] * (1 - p[i]));
            int maxx = 0;
            for (int i = 1; i <= v;++i)
            if (dp[i]>=(1-pp))
                maxx = max(i, maxx);
            printf("%d\n", maxx);
        }
    }
  • 相关阅读:
    (十六)字段表集合
    (十五)类索引
    (十四)访问标志 Access_flags
    (一)单例模式
    (二十三)IDEA 构建一个springboot工程,以及可能遇到的问题
    (十三)class文件结构:常量池(转)
    Hive优化
    标签整理
    一些学习资料
    jstree树形菜单
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9462921.html
Copyright © 2011-2022 走看看