zoukankan      html  css  js  c++  java
  • [JZOJ4685] 【NOIP2016提高A组8.12】礼物

    Description

    夏川的生日就要到了。作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物。
    商店里一共有种礼物。夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得)。
    每次,店员会按照一定的概率Pi(或者不拿出礼物),将第i种礼物拿出来。季堂每次都会将店员拿出来的礼物买下来。
    众所周知,白毛切开都是黑的。所以季堂希望最后夏川的喜悦值尽可能地高。
    求夏川最后最大的喜悦值是多少,并求出使夏川得到这个喜悦值,季堂的期望购买次数。

    Input

    第一行,一个整数N,表示有N种礼物。
    接下来N行,每行一个实数Pi和正整数Wi,表示第i种礼物被拿出来的概率和可以获得喜悦值。

    Output

    第一行,一个整数表示可以获得的最大喜悦值。
    第二行,一个实数表示获得这个喜悦值的期望购买次数,保留3位小数。

    Sample Input

    3
    0.1 2
    0.2 5
    0.3 7

    Sample Output

    14
    12.167

    Data Constraint

    对于10%的数据,N = 1
    对于30%的数据,N ≤ 5
    对于100%的数据,N ≤ 20 ,0 < Wi ≤ 10^9 ,0 < Pi ≤ 1且∑Pi ≤ 1
    注意:本题不设spj

    第一问是显然的, 把所有的权值加起来。

    看着数据范围就知道是状压DP。

    所以设$large f[S]$为已买状态为S的期望步数。

    那么$large f[S] = sum f[S']*p[i] + (1 - sum p[i])*f[S]+1 $,因为有$large p[i]$的几率选到没选过的某一个, 有$large 1- sum p[i]$的几率选择之前选过的或者没有选到。

    然后移项 $large f[S]=frac{sum p[i]*f[S']+1}{sum p[i]}$.

    于是可以递推了。

    复杂度$large O(2^{N})$


    #include <iostream>
    #include <cstdio>
    using namespace std;
    inline int read() {
        int res=0;char ch=getchar();
        while(!isdigit(ch))ch=getchar();
        while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48), ch=getchar();
        return res;
    }
    #define ll long long
    #define reg register
    int n;
    double p[25];
    int w[25];
    ll ans;
    int bin[25];
    double f[1<<22];
    
    int main()
    {
        bin[0] = 1;for (int i = 1 ; i <= 22 ; i ++) bin[i] = bin[i-1] << 1;
        n = read();
        for (reg int i = 1 ; i <= n ; i ++)
            scanf("%lf", &p[i]), ans += (w[i] = read());
        printf("%lld
    ", ans);
        for (reg int S = 1 ; S <= (1 << n) - 1 ; S ++)
        {
            double tot = 0;
            for (reg int i = 1 ; i <= n ; i ++)
            {
                if (S & bin[i-1])
                    f[S] += f[S-bin[i-1]] * p[i], tot += p[i];
            }
            f[S] = (f[S] + 1) / tot;
        }
        printf("%.3lf
    ", f[(1<<n)-1]);
        return 0;
    }
  • 相关阅读:
    MIPI DIsplay Panel And Linux Driver Model【转】
    Vim|多行行尾插入【转】
    LCD之mipi DSI接口驱动调试流程【转】
    Linux中的DRM 介绍【转】
    linux DRM driver 使用示例【转】
    从零开始写设备树DTS【转】
    linux内核中的宏ffs(x)【转】
    procps工具集 ----Linux中的可用内存指的是什么?【转】
    ps命令交叉编译【转】
    交叉编译Procps-ng-3.3.11【转】
  • 原文地址:https://www.cnblogs.com/BriMon/p/9520450.html
Copyright © 2011-2022 走看看