BZOJ 1076 [SCOI 2008] 獎勵關 (概率與期望)

題目鏈接:BZOJ 1076

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int K,N;
int a[50],v[50];
double dp[110][32800];

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

int main(){
	K=read(); N=read();
	for(int i=1;i<=N;i++){
		v[i]=read(); int x;
		while(x=read()){
			a[i]+=(1<<(x-1));//a[i]爲第i件物品能夠取的條件
		}
	}

	for(int i=K;i>=1;i--){
		for(int j=0;j<(1<<N);j++){
			for(int p=1;p<=N;p++){
				if((j&a[p])==a[p]){
					dp[i][j]+=max(dp[i+1][j],dp[i+1][j|(1<<(p-1))]+(double)v[p]);
				}
				else dp[i][j]+=dp[i+1][j];
			}
			dp[i][j]/=(double)N;
		}
	}
	printf("%.6lf",dp[1][0]);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章