传送门

题意:$n$种宝物,出现$k$次每次一种,每种宝物有价值和吃掉它之前必须要吃掉的宝物的集合,求采取最优策略的期望最大价值

1<=k<=100,1<=n<=15,分值为[-10^6,10^6]内的整数。


看到$n$应该想到状压....

$f[i][s]$表示前$i$次已经吃掉的集合为$s$的期望最大值

然而正推的话,答案是谁呢?

所以倒推,表示这个状态到结束得到的期望最大值

转移枚举出现的宝物,最后乘上概率$\frac{1}{n}$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=,S=<<;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int m,n,val[N],need[N];
double f[N][S];
int main(){
freopen("in","r",stdin);
m=read();n=read();
for(int i=;i<n;i++){
val[i]=read();int x=read();
while(x) need[i]|=(<<(x-)),x=read();
}
int All=<<n;
for(int i=m;i>=;i--)
for(int s=;s<All;s++){
for(int j=;j<n;j++){
if((s&need[j])==need[j]) f[i][s]+=max(f[i+][s],f[i+][s|(<<j)]+val[j]);
else f[i][s]+=f[i+][s];
}
f[i][s]/=n;
}
printf("%.6lf",f[][]);
}

最新文章

  1. python画决策树
  2. ffmpeg-20160803-bin.7z
  3. SharePoint 跨域还原网站一则
  4. Linux C 程序 进程控制(17)
  5. Spring Cp30配置
  6. java结构与算法之冒泡排序
  7. Android模拟器设置竖屏
  8. 数据结构与算法(C/C++版)【绪论/线性表】
  9. 对Bitmap的内存优化
  10. JS ES6的变量的结构赋值
  11. Vue 错误记录:Cannot read property &#39;beforeRouteEnter&#39; of undefined
  12. 嵌入式GCC笔记
  13. Orchard详解--第四篇 缓存介绍
  14. HTTP1.1协议-RFC2616-中文版
  15. glViewport()函数和glOrtho()函数的理解(转)
  16. win 下 apache 实现负载均衡
  17. [翻译] FeSpinner
  18. Java多线程多个线程wait(),一个notify()唤醒,唤醒的顺序
  19. ubuntu修改固定ip
  20. js判断用户是在PC端或移动端访问

热门文章

  1. jq.paginator分页插件稍加修改
  2. webpack运行常见错误归纳
  3. HDU 5122 K.Bro Sorting(模拟——思维题详解)
  4. WPF 实现新手指引功能 DEMO
  5. 【开发技术】如何查看项目中struts的版本
  6. 您是不是奇怪为什么 &lt;script&gt; 标签中没有 type=&quot;text/javascript&quot; 属性?
  7. java LinkedLis t的26种使用方法
  8. 使用 cURL 度量 Web 站点的响应时间
  9. confirm显示数组中的内容时,总是带一个逗号分隔的解决方法
  10. 一、Html简介