您的位置:首页 > 其它

HDU 4336 Card Collector

2013-11-17 00:50 218 查看
题意:有n种卡片,每袋零食里面有p[i]的概率含有卡片i,最多含有一张卡片,也可能不含卡片。求要收集齐n张卡片所需要买的零食袋数的期望。(1 <= n <= 20)

解法:状压DP+概率DP。设d[i]表示含有卡片的状态为i时所需的期望零食袋数。d[i] = Σ((d[i] + 1)*p[j]) + Σ((d[i|(1<<k)]+1)*p[k]),其中j表示i状态下已经拥有的卡片,k表示没有的。

tag:状压DP,概率DP

/*
* Author:  Plumrain
* Created Time:  2013-11-16 21:24
* File Name: DP-HDU-4336.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define CLR(x) memset(x, 0, sizeof(x))

double d[1<<20], p[100];

int main()
{
int n;
while (scanf ("%d", &n) != EOF){
double px = 1.0;
for (int i = 0; i < n; ++ i){
scanf ("%lf", &p[i]);
px -= p[i];
}

CLR (d);
for (int i = (1<<n) - 2; i >= 0; -- i){
double tmp = px;
for (int j = 0; j < n; ++ j){
if (!(i & (1<<j)))
d[i] += p[j] * (1 + d[i|(1<<j)]);
else
tmp += p[j];
}
d[i] = (d[i] + tmp) / (1 - tmp);
}
printf ("%.6f\n", d[0]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: