luogu2473 [SCOI2008]奖励关

题解参照这里
每个研究完记得乘一个1/n,这是乘了概率。

#include <iostream>
#include <cstdio>
using namespace std;
double dp[105][33005];
int n, k, p[25], d[25], uu;
int main(){
	cin>>k>>n;
	for(int i=1; i<=n; i++){
		scanf("%d", &p[i]);
		scanf("%d", &uu);
		while(uu){
			d[i] |= 1<<(uu-1);
			scanf("%d", &uu);
		}
	}
	for(int i=k; i>=1; i--)
		for(int j=0; j<(1<<n); j++){
			for(int l=1; l<=n; l++)
				if((j&d[l])==d[l])
					dp[i][j] += max(dp[i+1][j], dp[i+1][j|(1<<(l-1))]+p[l]);
				else
					dp[i][j] += dp[i+1][j];
			dp[i][j] /= n;
		}
	printf("%.6lf
", dp[1][0]);
	return 0;
}
原文地址:https://www.cnblogs.com/poorpool/p/8183040.html