【BZOJ1076】【SCOI2008】—奖励关(期望+状压dp)

传送门

考虑到当前选的物品会对后面决策产生影响,不好处理选还是不选,所以考虑从后往前递推

f[i][sta]f[i][sta]表示第ii轮,已选的状态为stasta时,后面最多可以得到的价值

然后就是简单题了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
inline int read(){
    char ch=getchar();
    int res=0,f=1;
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
    return res*f;
}
const int K=105;
const int N=17;
double a[N],f[K][1<<15],ans;
int n,k,pre[N];
int main(){
	k=read();
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();int x=read();
		while(x){
			pre[i]+=(1<<(x-1));
			x=read();
		}
	}
	int sta=(1<<n)-1;
	for(int p=k;p;p--){
		for(int i=0;i<=sta;i++){
			for(int j=1;j<=n;j++){
				if((i&pre[j])==pre[j])
					f[p][i]+=max(f[p+1][i],f[p+1][i|(1<<(j-1))]+a[j]);
				else f[p][i]+=f[p+1][i];
			}
			f[p][i]/=n;
		}
	}
	printf("%.6lf",f[1][0]);
}
原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145671.html