正题
题面轻戳
这题考虑状压逆推。
表示第1天到第i-1天取得宝物状态为j,后面所拿到的最大价值。
考虑转移。
不吃的话,那就直接继承,如果吃,那么就可以看一下吃下这个宝物的价值 与 吃完这个宝物的“后继效应”。
不断转移。
答案即为
不懂的看代码。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int K,n;
double f[110][1<<15];
int op[20];
int d[20];
int main(){
scanf("%d %d",&K,&n);
for(int i=1;i<=n;i++){
scanf("%d",&d[i]);
int x;
while(1){
scanf("%d",&x);
if(x==0) break;
op[i]|=(1<<(x-1));//op[i]记录的是吃i所需的前提条件。
}
}
for(int i=K;i>=1;i--){
for(int j=0;j<=(1<<n)-1;j++){
for(int k=1;k<=n;k++)
if((j&op[k])==op[k]) f[i][j]+=max(f[i+1][j],f[i+1][j|(1<<(k-1))]+d[k]);
else f[i][j]+=f[i+1][j];//不满足就直接继承
f[i][j]/=n;//平均情况,所以除以n
}
}
printf("%.6lf",f[1][0]);
}