hdu4336 Card Collector 概率dp(或容斥原理?)
题意:
买东西集齐全套卡片赢大奖。每个包装袋里面有一张卡片或者没有。
已知每种卡片出现的概率 p[i],以及所有的卡片种类的数量 n(1<=n<=20)。
问集齐卡片需要买东西的数量的期望值。
一开始,自己所理解的期望值是原来学过的 一个值*它自身发生的概率,这没错,但是不知道在这一题里面 那个值是多少
经过重重思考和挣扎最后明白了,这一题中,n就是那个值,也是你要求的,感觉理解这个好难,但是好重要,
此题中,将n设置为 dp[0]
可以这样想,你要买sum包,才能集齐n种卡片,那么 你最后买的一包一定中奖,即一定是n种中的一种,
用状态压缩表示,dp[1111111]就表示,你现在可以要n包中的一包,也就是可以变成0111111,1011111,1101111.。。。1111110中的一种状态
dp[1111111]=上面列的所有的状态 乘以 中0那包的概率,即dp[i]+=dp[i|(1<<j)]*p[j];
而dp[1111111]表示刚开始,你可以中任一种,它的期望值是0,因为你现在任一种都没有,
dp[0000000]即 dp[0] 则表示现在每一包都有,你已经不用买了,从直观上就可以理解为每位都是0,你没有选择了,
那么,给初值dp[(1<<n)-1]=0,
从这开始,对每一种状态,列举它的每一位,如果是0,则可以变成该位是1的状态,
恩,,差不多就是这样吧。。
不知道自己的理解是否正确 觉得关键还是期望值的意义和最后的结果的意义不太能理解。。
反正我只能理解到这一步了,望批评指正交流
关于容斥原理的解法,还没怎么想,大家可以百度下 ,看起来好简单的样子
下面是参考代码,大家感受下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std; double p[25],dp[1<<20]; int main()
{
int i,j,n;
double pp;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%lf",&p[i]);
dp[(1<<n)-1]=0;
for(i=(1<<n)-2;i>=0;i--)//枚举所有状态
{
pp=0;
dp[i]=1;
for(j=0;j<n;j++)//对每一位枚举
{
if(!(i&(1<<j)))//该位是0
{
dp[i]+=dp[i|(1<<j)]*p[j];
pp+=p[j];
}
}
dp[i]/=pp;//可以到达i这种状态的状态都找到了 在循环里累加的是期望值 要除概率和
}
printf("%lf\n",dp[0]);
}
return 0;
}
hdu4336 Card Collector 概率dp(或容斥原理?)的更多相关文章
- HDU-4336 Card Collector 概率DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意:买食品收集n个卡片,每个卡片的概率分别是pi,且Σp[i]<=1,求收集n个卡片需要 ...
- hdu4336 Card Collector(概率DP,状态压缩)
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...
- HDU4336 Card Collector (概率dp+状压dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意:有n种卡片,一个包里会包含至多一张卡片,第i种卡片在某个包中出现的次数为pi,问将所有种类的卡片集齐 ...
- $HDU$ 4336 $Card\ Collector$ 概率$dp$/$Min-Max$容斥
正解:期望 解题报告: 传送门! 先放下题意,,,已知有总共有$n$张卡片,每次有$p_i$的概率抽到第$i$张卡,求买所有卡的期望次数 $umm$看到期望自然而然想$dp$? 再一看,哇,$n\le ...
- hdu4336 Card Collector 状态压缩dp
Card Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 4336 Card Collector 期望dp+状压
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Time Limit: 2000/1000 MS (Java/O ...
- [HDU4336]Card Collector(min-max容斥,最值反演)
Card Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- [HDU4336]:Card Collector(概率DP)
题目传送门 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物.商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值$W_i$(每种礼物的喜悦值不能重复获得).每 ...
- hdu4336 Card Collector 容斥原理
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...
随机推荐
- java PO、BO
PO(persistent object) 持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,那么这个概念也就不存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数 ...
- python程序中自启动appium服务
普通启动Appium服务方法: 打开cmd,运行命令: #>appium -a 127.0.0.1 -p 4723 当程序输出如上图信息的时候,表示appium启动成功,此时便可以运行 ...
- WMI使用的WIN32_类库名
WMI使用的WIN32_类库名 包括:硬件类.操作系统类.安装应用程序类.WMI服务管理类.性能计数器类1.硬件类冷却类别Win32_Fan--风扇Win32_HeatPipe--热管Win32_Re ...
- gson在java和json串之间的应用
public class JsonToJavaUtil { /** * 将json转成成javaBean对象 * * @param <T> * 返回类型 * @param json * 字 ...
- 《Linux设备驱动程序》 笔记1
驱动程序的任务 通常来讲,驱动(模块)要执行两类任务: 模块中的某些函数作为系统调用的一部分执行(按照既定规则填补必需的系统调用模块) 其他函数负责终端处理 内核中的并发 为什么考虑并发问题: Lin ...
- ZOJ-3686 A Simple Tree Problem 线段树
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3686 题意:给定一颗有根树,每个节点有0和1两种值.有两种操作: ...
- html5 canvas图片翻转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 第三百三十一天 how can I 坚持
今天加了一天班,好累,还没吃晚饭,回来只吃了个泡面. 晚上回来的路上,在群里聊的倒是很happy,快笑死我了,仲宫二少,哈哈. 弟弟过两天要去见面,多聊聊,该结婚来. 还有,中午吃的肯德基,不好吃,可 ...
- show index 之Cardinality (mysql)
show index 之Cardinality 官方文档的解释: Cardinality An estimate of the number of unique values in the inde ...
- labview在线帮助网址
http://zone.ni.com/reference/zhs-XX/help/371361L-0118/ labview网络讲坛 网址 http://v.eepw.com.cn/video/com ...