題目鏈接: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;
}