ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

『动态规划·状态压缩·概率期望』礼物

2019-07-05 21:37:37  阅读:270  来源: 互联网

标签:概率 期望 int 压缩 1f pj 去掉 sum 礼物


题目描述

在这里插入图片描述

题解

首先普及一个知识点,每一件物品选到的概率是pip_ipi​,则在所有物品里面至少选到一件的概率是:pi\sum p_i∑pi​.

然后就是很明显的概率状压了。

我们设f[i]f[i]f[i]表示状态为i的期望次数。

则一定有:f[i]=j in if[ij]pj+(1j in ipj)f[i]+1f[i]=\sum_{j\ in\ i}f[i去掉j]*p_j+(1-\sum_{j\ in\ i} p_j)*f[i]+1f[i]=j in i∑​f[i去掉j]∗pj​+(1−j in i∑​pj​)∗f[i]+1

移项以后就有:f[i]=j in if[ij]pjj in ipj+1f[i]=\frac{\sum_{j\ in\ i}f[i去掉j]*p_j}{\sum_{j\ in\ i} p_j}+1f[i]=∑j in i​pj​∑j in i​f[i去掉j]∗pj​​+1

代码如下:

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 21;

int n, sum = 0;
int v[N];
double p[N], f[1<<N];

signed main(void)
{
	freopen("gift.in","r",stdin);
	freopen("gift.out","w",stdout);
	cin>>n;
	for (int i=1;i<=n;++i) 
	    cin>>p[i]>>v[i],
		sum += v[i];
	cout<<sum<<endl;
	for (int i=1;i<(1<<n);++i)
	{
		double sum = 0.000;
		for (int j=1;j<=n;++j)
		    if (((i >> j-1) & 1) == 1) 
		    {
		    	f[i] += p[j]*f[i^(1<<j-1)];
		    	sum += p[j];
			}
		f[i] = (f[i]+1)*1.0/sum;
	}
	printf("%.3lf",f[(1<<n)-1]);
	return 0;
} 

总结:

计算期望的时候,一个常见的套路就是上一部的期望乘上当前的概率+1.

标签:概率,期望,int,压缩,1f,pj,去掉,sum,礼物
来源: https://blog.csdn.net/Ronaldo7_ZYB/article/details/94767343

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有