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

 

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 软件测试的基本理论知识_软件测试基础知识整理

    软件测试的基本理论知识_软件测试基础知识整理01软件研发流程1.软件产品软件产品是指向用户提供的计算机软件、信息系统或设备中嵌入的软件或在提供计算机信息系统集成、应用服务等技术服务时提供的计算机软件。2.软件工程软件工程,英文名SoftwareEngineering,是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。“软件工程是开发、运行、维护和修复软件的系统方法。”这个定义相当概括,它主要强调软件工程是系统方法而不是某种…

    2025年7月30日
    4
  • html音乐播放器标签,打造属于自己的音乐播放器 HTML5之audio标签

    html音乐播放器标签,打造属于自己的音乐播放器 HTML5之audio标签我的音乐播放器HTML5中增加了Audio和Video标签,这两个标签的用法非常相似。功能却是相当强大,我们先来看一下Audio标签各个浏览器的支持情况。这里用的依然是CanIUse这个在线网站,相信学习前端的同学应该都不陌生。CanIUse我们可以看到,各大浏览器对这个元素的支持是非常给力的,除了IE8以前的和OperaMini,所以justdoit。相关文档:AudioMDN…

    2022年7月25日
    19
  • ireport使用教程_layout怎么导入图片

    ireport使用教程_layout怎么导入图片ireport插入图片1.在模板上拖一个image组件,设置它的image Expression为变量$P{logo},如图示,属性下面的is lazy勾上。  不然有可能最后页面渲染出来的image的src为nullimage_0_0_0。2.给变量logo的值。  StringbasePath=request.getScheme()+”://”+requ

    2025年10月20日
    4
  • Keil MDK 2020过期问题[通俗易懂]

    Keil MDK 2020过期问题[通俗易懂]KeilMDK2020过期问题由于到2020年过期,之前曾担心到2020年是否我们用KEILMDK所编写的代码,全部不可用。经过今天测试,虽然软件提示过期,不过依然可以正常使用,只是没有软件的支持维护而已。用微信扫描二维码为博主打个赏金额随意快来“打”我呀要买枸杞当归补补~~转自:https://www.zhjm.site/wordpress/?p=340…

    2022年5月9日
    206
  • ESP8266模块使用完整教程「建议收藏」

    在我入门ESP8266小黄板的过程中,过程是艰难的,因为网络上的资料太多太乱,官网上的资料不算太完备,而在技术交流群里面的就更乱了,所以想按自己学习所总结到的经验来分享给大家。资源链接:http://pan.baidu.com/s/1i4qjrY9请使用本教程之前先下载以上资源。前言:esp8266我用到的是小黄板测试板,而ESP8266主要有两种固件,一种是AT固件,一种是IOT固件。前者用串

    2022年4月18日
    229
  • 密立根实验的java数据处理

    密立根实验的java数据处理importjavax.swing.JOptionPane;importjava.text.DecimalFormat;publicclassurl{ publicstaticvoidmain(String[]args) {  StringnumStr,tstr1,tstr2,tstr3,tstr4,tstr5,result;  intU,again

    2022年5月11日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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