1. 程式人生 > >期望題集--[SCOI2008]獎勵關

期望題集--[SCOI2008]獎勵關

記憶化搜尋,狀態記錄到第幾個寶物,當前有的寶物集合,採取最優策略平均情況下最終能得到最大分值期望

程式碼:

#include<bits/stdc++.h>
#define db double
using namespace std;
const int N=110,M=15;
const db inf=1e9;
const db eps=1e-8;

int k,n,a[M+5],qt[M+5];
db f[N][1<<M];

int dcmp(db x)
{return x<-eps?-1:x>eps;}
db dfs(int pos,int sta)
{
    if(pos>k)return 0;
    if(f[pos][sta]!=-inf)return f[pos][sta];
    db res=0;
    for(int nx=1;nx<=n;nx++)
    {
        if((qt[nx]&sta)==qt[nx])
            res+=max(dfs(pos+1,sta),dfs(pos+1,sta|(1<<(nx-1)))+a[nx])/n;
        else res+=dfs(pos+1,sta)/n;
    }
    return f[pos][sta]=res;
}
int main()
{
    int tp,nw;
    scanf("%d%d",&k,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        nw=0;
        while(1)
        {
            scanf("%d",&tp);
            if(tp==0)break;
            nw|=(1<<(tp-1));
        }
        qt[i]=nw;
    }
    for(int i=0;i<=k;i++)
        for(int j=0;j<(1<<n);j++)
            f[i][j]=-inf;
    printf("%.6lf",dfs(1,0));
}