标签:des style blog http io color ar os java
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2711 Accepted Submission(s): 1277
Special Judge
题意:
有N(1<=N<=20)张卡片,每包中含有这些卡片的概率为p1,p2,````pN.
每包至多一张卡片,可能没有卡片。
求需要买多少包才能拿到所以的N张卡片,求次数的期望。
分析:
n为20,2^20 = 1 048 576;
所以可以用每一位来表示这种卡片有没有存在,还是逆推。
逆推公式:
d[i] = 1.0 + d[i]*p2 + d[i | (1<<j)]*p[j];
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <queue> 6 #include <cmath> 7 #include <algorithm> 8 #define LL __int64 9 const int maxn = (1<<20) + 10; 10 using namespace std; 11 double d[maxn], p[30]; 12 13 int main() 14 { 15 int n, i, j; 16 double sum, tmp; 17 while(~scanf("%d", &n)) 18 { 19 memset(d, 0, sizeof(d)); 20 sum = 0; 21 for(i = 0; i < n; i++) 22 { 23 scanf("%lf", &p[i]); 24 sum += p[i]; 25 } 26 tmp = 1.0-sum; 27 d[(1<<n)-1] = 0; 28 for(i = (1<<n)-2; i >= 0; i--) 29 { 30 double p2 = tmp, p3 = 0; 31 for(j = 0; j < n; j++) 32 { 33 if(i&(1<<j)) 34 p2 += p[j]; //p2表示没有抽到新的卡片的概率和 35 else 36 p3 += p[j] * d[i|(1<<j)]; 37 } 38 d[i] += (1.0+p3)/(1.0-p2); 39 } 40 printf("%.4lf\n", d[0]); 41 } 42 return 0; 43 }
hdu 4336 Card Collector (概率dp+位运算 求期望)
标签:des style blog http io color ar os java
原文地址:http://www.cnblogs.com/bfshm/p/4079809.html