题解 P2473 【[SCOI2008]奖励关】
P2473 SCOI2008奖励关
题面懒得描述。
根据题意列出
考虑顺序枚举,最后得到的答案有
然后写代码,发现如果先枚举
考虑转移,显然转移要考虑这一层能否对下一层产生影响,那就要考虑能不能包含
最后
最后代码奉上
#include<touwenjian.h>
using namespace std;
double f[110][75536];
int s[20],a[20];
int n,m;
int main()
{
scanf("%d %d",&m,&n);
int i,j,t;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
while(1)
{
scanf("%d",&t);
if(t==0) break;
s[i]|=1<<(t-1);
}
}
int k;
for(i=m;i;i--)
for(k=0;k<=(1<<n)-1;k++)
{
for(j=1;j<=n;j++) if((s[j]&k)==s[j]) f[i][k]+=max(f[i+1][k],f[i+1][k|(1<<(j-1))]+a[j]);
else f[i][k]+=f[i+1][k];
f[i][k]=f[i][k]*1.0/n;
}
printf("%.6lf",f[1][0]);
}