hdu4336 Card Collector 概率dp(或容斥原理?)

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;
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110054.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pythoncharm怎么保存_pycharm怎么设置代码自动保存「建议收藏」

    pythoncharm怎么保存_pycharm怎么设置代码自动保存「建议收藏」pycharm一般安装完毕,就是默认是自动保存的,但是……但是….既然是程序,既然是软件,就难免出现bug。也许会有码友出现头天晚上写好的代码,打开一看,第二天白花花一片!!!泪奔有没有最简单的,就是每次编写完毕,习惯按ctrl+s手动保存。但是,提醒你务必检查一下你的设置里面,是不是码友弄好自动保存!步骤如下:菜单File->Settings…->Ap…

  • SEO学习(九)——快速网站诊断(Google网管工具)[通俗易懂]

    SEO学习(九)——快速网站诊断(Google网管工具)[通俗易懂]SEO服务商在刚刚与客户接触时,尤其需要对目标为网站做快速检查,发现其中的重要问题。一、快速诊断的步骤:   1、检查与研究竞争对手网站时同样的指标,另外还要计算页面收录比例(即搜索引擎收录页面数也网站实际总页面数之比)。   2、查看Google网站管理员工具给出的信息。二、Google网管工具1、robots文件检查     整个网站不能收录或某个目录下所有页面都不

  • MySQL相关 – 死锁的发生和避免

    MySQL相关 – 死锁的发生和避免

  • 自动化测试+性能面试题整理–个人最新【持续更新】「建议收藏」

    自动化测试+性能面试题整理–个人最新【持续更新】「建议收藏」写在前面公司要求招一名自动化测试,能力要求不高,1年左右自动化经验+部分性能经验即可,让我出一份题,我就百度+公司项目遇到的问题,出了一份,出题整体思路是:接口自动化问题+性能问题+规划的ui、app自动化+整体质量体系建设等多方面考虑。下面是正题自动化测试面试题1:基础篇目的:验证求职者是否在自动化测试岗位有实际应用于生产的工作经验1、使用什么测试框架做的上一个项目的自动化测试?说下怎么…

  • bs与cs的区别简述_bs和cs页面

    bs与cs的区别简述_bs和cs页面B/SB/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的,Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。不依赖用户的电脑操作系统环境,只与浏览器环境有关,当然由于网页复杂性,又延伸出网页前端技术与后端技术,前端技术指的是在浏览器上编程的技术,比如:JS,HTML,CSS,这些前端技术是运行在客户端B

    2022年10月16日
  • 防火墙

    防火墙

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号