bzoj1076【SCOI2008】奖励关

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1076

   有n种物品等概率落下,求期望最优收益

sol:  一眼看上去就是状压dp吧QAQ数据范围就能看出来啦

   f[i][j]表示前i次状态为j的答案

   每次对于每个物品都需要转移一遍,三个for即可

   为避免从无效状态转到有效状态,i倒着扫即可

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,K,pow[20],val[20],pre[20];
double f[110][100010];
int main()
{
    pow[0]=1;for(int i=1;i<20;i++) pow[i]=pow[i-1]*2;
    scanf("%d%d",&K,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&val[i]);
        while(1)
        {
            int tmp;scanf("%d",&tmp);
            if(tmp!=0) pre[i]+=pow[tmp];
            else break;
        }
    }
    for(int i=K;i>=0;i--)
        for(int j=0;j<pow[n+1];j++)
        {
            for(int k=1;k<=n;k++)
            {
                if((pre[k]&j)==pre[k])
                   f[i][j]+=max(f[i+1][j],f[i+1][j|pow[k]]+val[k]);
                else f[i][j]+=f[i+1][j];
            }
            f[i][j]/=n;
        }
    printf("%.6lf",f[1][0]);
    return 0;
}
posted @ 2017-01-13 15:57  Czarina  阅读(281)  评论(0编辑  收藏  举报