zoukankan      html  css  js  c++  java
  • hdu 2955

    01背包+概率

    题意:在不大于给定概率的情况下,算出最多可以拿到多少宝藏

    思路:考虑到背包的容量不是整数,传统的背包就不能做了,这时候就看那个量还能作为背包的容量,

    可以用总的宝藏数量当背包容量,在保证取得的宝藏尽量多的时候,概率还不能大于题目给定的概率,

    算被抓的情况比较多,可以算反面不被抓的概率为:(1-a)*(1-b)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<cctype>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    typedef long long LL;
    #define N 100100
    #define INF 0x3f3f3f3f
    
    int p[N];
    double w[N], dp[N];
    
    int main()
    {
        int T, n, sum;
        double v;
        scanf("%d", &T);
    
        while(T--)
        {
            scanf("%lf%d", &v, &n);
            memset(dp, 0, sizeof(dp));
            dp[0]=1;
            sum=0;
            for(int i=1; i<=n; i++)
            {
                scanf("%d%lf", &p[i], &w[i]);
                sum+=p[i];
            }
    
            for(int i=1; i<=n; i++)
            {
                for(int j=sum; j>=p[i]; j--)
                    dp[j]=max(dp[j], dp[j-p[i]]*(1-w[i]));
            }
    
            for(int i=sum; i>=0; i--)
            {
                if(dp[i]>=(1-v))
                {
                    printf("%d
    ", i);
                    break;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    接口
    java基础
    java的反射
    按照字典序打印所有的字符串
    求幂的问题
    时间复杂度与空间复杂度
    孩子们的游戏(圆圈中最后剩下的数)
    约瑟夫环问题
    翻转单词顺序列
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/9968jie/p/5795592.html
Copyright © 2011-2022 走看看