HDU4336-Card Collector(概率DP求期望)
来源:互联网 发布:arm linux gnu gcc 编辑:程序博客网 时间:2024/06/05 05:50
Card Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2195 Accepted Submission(s): 1034
Special Judge
Problem DescriptionIn your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in the famous novel Water Margin, you will win an amazing award.
As a smart boy, you notice that to win the award, you must buy much more snacks than it seems to be. To convince your friends not to waste money any more, you should find the expected number of snacks one should buy to collect a full suit of cards.
InputThe first line of each test case contains one integer N (1 <= N <= 20), indicating the number of different cards you need the collect. The second line contains N numbers p1, p2, ..., pN, (p1 + p2 + ... + pN <= 1), indicating the possibility of each card to appear in a bag of snacks.
Note there is at most one card in a bag of snacks. And it is possible that there is nothing in the bag.
OutputOutput one number for each test case, indicating the expected number of bags to buy to collect all the N different cards.
You will get accepted if the difference between your answer and the standard answer is no more that 10^-4.
Sample Input10.120.1 0.4
Sample Output10.00010.500
Source2012 Multi-University Training Contest 4
Recommendzhoujiaqi2010 | We have carefully selected several similar problems for you: 4337 4331 4332 4333 4334
题目大意:要集齐N张卡片,每包干脆面出现每种卡片的概率已知,问你集齐N张卡片所需要的方便面包数的数学期望
思路:DP[mask]表示已经收集到的卡片距离收集完所有卡片的天数的数学期望
DP[mask[ = DP[mask]*P1+SUM(DP[mask|1<<j]*P)+1#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxn = 1<<20;double dp[maxn];double p[30];int n;int main(){ while(cin >> n){ for(int i = 0; i < n; i++) scanf("%lf",&p[i]); int d = (1<<n)-1; memset(dp,0,sizeof dp); dp[d] = 0; for(int i = d-1; i >= 0; i--){ double t = 1.0,tp = 0.0; for(int j = 0; j < n ; j++){ if((i&(1<<j))==0){ t += dp[i|(1<<j)]*p[j]; tp += p[j]; } } dp[i] = t/tp; } printf("%.4lf\n",dp[0]); } return 0;}
As a smart boy, you notice that to win the award, you must buy much more snacks than it seems to be. To convince your friends not to waste money any more, you should find the expected number of snacks one should buy to collect a full suit of cards.
Note there is at most one card in a bag of snacks. And it is possible that there is nothing in the bag.
You will get accepted if the difference between your answer and the standard answer is no more that 10^-4.
10.120.1 0.4
10.00010.500
#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxn = 1<<20;double dp[maxn];double p[30];int n;int main(){ while(cin >> n){ for(int i = 0; i < n; i++) scanf("%lf",&p[i]); int d = (1<<n)-1; memset(dp,0,sizeof dp); dp[d] = 0; for(int i = d-1; i >= 0; i--){ double t = 1.0,tp = 0.0; for(int j = 0; j < n ; j++){ if((i&(1<<j))==0){ t += dp[i|(1<<j)]*p[j]; tp += p[j]; } } dp[i] = t/tp; } printf("%.4lf\n",dp[0]); } return 0;}
1 0
- HDU4336-Card Collector(概率DP求期望)
- [HDU4336]Card Collector(概率期望+状压dp)
- 【HDU4336】【Card Collector】【概率dp】
- 概率dp HDU4336 Card Collector
- hdu4336 Card Collector(期望dp)
- hdu4336 Card Collector 状压+概率DP
- hdu 4336 Card Collector 概率DP 求期望
- 【HDU4336】Card Collector-状态压缩DP+期望DP
- hdu4336 Card Collector 概率dp(或容斥原理?)
- hdu4336 Card Collector 状态压缩dp
- hdu 4336 Card Collector (概率与期望+状压DP)
- HDU 4336 Card Collector (概率-期望DP)【模板】
- Card Collector (概率dP)
- hdu4336(状压dp求期望)
- HDU4336 Card Collector 【容斥原理】【数学期望】
- HDU4336 Card Collector
- HDU4336 Card Collector
- hdu4336-----Card Collector
- Leveldb 实现原理
- 并查集(Union -Find)应用举例--基础篇
- vim配置
- 用友支持服务 从幕后走向前台
- 享元模式
- HDU4336-Card Collector(概率DP求期望)
- [leetcode]Multiply Strings
- Excel 已经检测到"xxx.xsl"是SYLK文件,但是不能将其加载解决方法
- JVM资料汇总
- H264实时编码及NALU,RTP传输(续)
- memset()函数详解
- CSS执行顺序与优先权
- 带模板的顺序循环队列
- 分布式缓存memcached原理