zoukankan      html  css  js  c++  java
  • bzoj1076:[SCOI2008]奖励关

    题解:

    状压dp+概率

    f[i][j]表示正在扔第i次,已经有了j这些物品(状压),还可以拿多少价值

    考虑当前抛第k个物品

    当k的要求满足,f[i][j]+=1/n*max(f[i+1][j']+a[i],f[i+1][j])

    当不满足,f[i][j]+=1/n*f[i+1][j]

    其中j'=j|(1<<(k))(我是从0开始标号的)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int p[105][1<<17],n,m,b[105];
    double f[105][1<<16],a[105],P;
    double dfs(int x,int y)
    {
        if (x>m)return 0;
        if (p[x][y])return f[x][y];
        p[x][y]=1;
        for (int i=0;i<n;i++)
         {         
             if ((y&b[i])!=b[i])f[x][y]+=(P*dfs(x+1,y));
             else f[x][y]+=max(P*dfs(x+1,y),P*(dfs(x+1,y|(1<<i))+a[i]));
         }
        return f[x][y];
    }
    int main()
    {
        scanf("%d%d",&m,&n);
        P=1;
        P/=n;
        for (int i=0;i<n;i++)
         {
             scanf("%lf",&a[i]);
             int x;
             scanf("%d",&x);
             while (x)
              {
                  b[i]+=(1<<(x-1));
                  scanf("%d",&x);
              }
         }
        printf("%.6lf",dfs(1,0));
    }
  • 相关阅读:
    计算机的基本存储单位
    挖坑
    HEOI2017 游记
    bzoj4815 [Cqoi2017]小Q的表格
    bzoj4817 [Sdoi2017]树点涂色
    hdu5824 graph
    4.5&4.7联考题解
    高飞
    无题
    51Nod 算法马拉松23 开黑记
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7628745.html
Copyright © 2011-2022 走看看