hdu4336 Card Collector

题目大意

有N(1<=N<=20)张卡片,每包中含有这些卡片的概率为p1,p2,````pN.
每包至多一张卡片,可能没有卡片。
求需要买多少包才能拿到所以的N张卡片,求次数的期望。

显然,这是一道概率dp,容斥原理也可以写
算概率一般是正推,算期望一般是逆推

代码实现

#include<cstdio>
#include<algorithm>
using namespace std;
const int mx=22;
double p[mx],dp[1<<mx];
int n;
int main(){
	while(scanf("%d",&n)!=EOF){
		double psum=0;
		for(int i=0;i<n;i++){
			scanf("%lf",&p[i]);
			psum+=p[i];
		}
		psum=1-psum;//卡包内没有牌的概率 
		dp[(1<<n)-1]=0;
		for(int i=(1<<n)-2;i>=0;i--){
			double x=0,sum=1;//转移到下一状态,必然需要买一包卡包 
			for(int j=0;j<n;j++){
				if(i&(1<<j))x+=p[j];
				else sum+=p[j]*dp[i|(1<<j)];
			}
			dp[i]=sum/(1-psum-x);
			//减去卡包内没有牌或有重复牌的情况 
		}
		printf("%.5lf\n",dp[0]);
	} 
} 
posted @   幽灵轩  阅读(67)  评论(0编辑  收藏  举报
编辑推荐:
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 开发的设计和重构,为开发效率服务
点击右上角即可分享
微信分享提示