期望題集--[SCOI2008]獎勵關
阿新 • • 發佈:2018-12-17
記憶化搜尋,狀態記錄到第幾個寶物,當前有的寶物集合,採取最優策略平均情況下最終能得到最大分值期望
程式碼:
#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)); }