BZOJ 1076【SCOI2008】 奖励关

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1076

【题意】

见题面。。。orz


【题解】

状压DP,从后往前推就行了


【代码】

#include <cstdio>

#include <iostream>

using namespace std;

double dp[110][100000];

int n,m,t;

int v[50],cnt[50];

int main()

{

    int i,j,k;

    scanf("%d%d",&n,&m);

    for (i=1;i<=m;i++)

    {

        scanf("%d%d",&v[i],&t);

        while (t)

        {

            cnt[i]+=(1<<(t-1));

            scanf("%d",&t);

        }

    }

     

    for (i=n;i>=0;i--)

        for (j=0;j<=(1<<m)-1;j++)

        {

            for (k=1;k<=m;k++)

                if ((cnt[k]&j)==cnt[k])

                   dp[i][j]+=max(dp[i+1][j],dp[i+1][j|(1<<(k-1))]+v[k]);

                else

                    dp[i][j]+=dp[i+1][j];

            dp[i][j]=dp[i][j]*1.0/m;

        }

    printf("%.6lf\n",dp[1][0]);

    return 0;

}

评论

© CodeDevil | Powered by LOFTER