期望dp第四题。
不难想到 d p [ i ] [ x ] dp[i][x] dp[i][x]表示 抛 出 宝 物 i 次 且 状 态 为 x 的 收 益 抛出宝物i次且状态为x的收益 抛出宝物i次且状态为x的收益
但是试图从前往后转移是行不通的
为 什 么 呢 ? 为什么呢? 为什么呢?
本 状 态 转 移 给 下 一 个 状 态 , 给 每 个 状 态 都 是 均 分 为 1 n 本状态转移给下一个状态,给每个状态都是均分为\frac{1}{n} 本状态转移给下一个状态,给每个状态都是均分为n1
但 是 前 面 的 状 态 转 移 给 自 己 时 , 却 不 一 定 以 1 n 的 概 率 转 移 而 来 但是前面的状态转移给自己时,却不一定以\frac{1}{n}的概率转移而来 但是前面的状态转移给自己时,却不一定以n1的概率转移而来
#include <bits/stdc++.h>
using namespace std;
double dp[109][1<<16];
int p[21],a[21],k,n;
int main()
{
cin >> k >> n;
for(int i=0;i<n;i++)
{
cin >> a[i];
int x;;
while( cin>>x && x )
p[i]+=( 1<<(x-1) );
}
int last=(1<<n);
for(int i=k;i;i-- )
{
for(int j=0;j<last;j++)
for(int q=0;q<n;q++)
{
if( (j&p[q])==p[q] )//可选可不选
dp[i][j]+=max( dp[i+1][j],dp[i+1][j|(1<<q)]+a[q] );
else//拿不了,只能这么转移
dp[i][j]+=dp[i+1][j];
if( q==n-1 ) dp[i][j]/=(double)n;
}
}
printf("%.6lf",dp[1][0] );
}