题目:https://www.luogu.org/problemnew/show/P2473
还是对DP套路不熟悉...
像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推;
看n只有15那么考虑状压,期望什么的就是除一下n就行了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,p[],cnt[],s[];
double f[][<<];
int main()
{
scanf("%d%d",&k,&n);
for(int i=,x;i<=n;i++)
{
scanf("%d",&p[i]);
while(scanf("%d",&x)==)
{
if(!x)break;
s[i]|=(<<(x-));
}
}
for(int i=k;i;i--)
{
for(int j=;j<(<<n);j++)
{
for(int l=;l<=n;l++)
{
if((s[l]|j)==j)
f[i][j]+=max(f[i+][j],f[i+][j|(<<(l-))]+p[l]);
else f[i][j]+=f[i+][j];
}
f[i][j]/=n;
}
}
printf("%.6lf",f[][]);
return ;
}