题目大意:K次抛出宝物,每次抛出等概率的抛出n个物品中的一个,每个物品有一个价值,想获得每个物品必须先获得一些另一些物品。求最终获得的价值的期望
题解:
f[i][s]表示第i次,宝物状态为s的期望得分
,转移显然
但是需要逆推……因为正着会遇到一些不可能状态
我的收获:~~~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M=17;
int k,n,tot;
int p[M];
int val[M],use[M];
double f[105][1<<M];
void work()
{
for(int i=k;i>=1;i--)
for(int j=0;j<tot;j++){
for(int l=1;l<=n;l++)
{
if((use[l]&j)==use[l])
f[i][j]+=max(f[i+1][j],f[i+1][j|p[l]]+val[l]);
else f[i][j]+=f[i+1][j];
}
f[i][j]/=n;
}
printf("%.6lf",f[1][0]);
}
void init()
{
cin>>k>>n;tot=1<<n;
for(int i=1;i<=n;i++) p[i]=1<<(i-1);
for(int i=1;i<=n;i++){
cin>>val[i];
int x;
while(scanf("%d",&x)!=EOF&&x)
use[i]|=p[x];
}
}
int main()
{
init();
work();
return 0;
}