HDU 4336 Card Collector

链接

题意

  给n张卡片,每张卡片都有出现的概率,求收集到全部的卡片的期望次数。

思路

  状压dp。dp[i] 表示收集了i张,的期望次数。dp[n]=0;可能自己转移到自己,解一下方程。

  记zz的bug:1、1<<20在计算器中算完了之后是1048576,然后就少看了一位,开了110000,然后就一直 Runtime Error (ACCESS_VIOLATION)。2、千万不要看到样例是3位,然后就输出了3位。。。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<cmath>
 6 
 7 using namespace std;
 8 
 9 const int N = (1<<21)+10;
10 
11 double p[30],dp[N];
12 
13 int main() {
14     int n;
15     while (~scanf("%d",&n)) {
16         for (int i=1; i<=n; ++i) scanf("%lf",&p[i]);
17         int t = (1 << n) - 1;
18         dp[t] = 0;
19         for (int s=t-1; s>=0; --s) {    
20             double tmp = 0,p0 = 0;
21             for (int i=1; i<=n; ++i) {
22                 if (s & (1<<(i-1))) continue;
23                 tmp += dp[s | (1<<(i-1))] * p[i];
24                 p0 += p[i];
25             }
26             dp[s] = (tmp+1.0)/p0;
27         }
28         printf("%lf\n",dp[0]);
29     }
30     return 0;
31 }

 

  

posted @ 2018-04-28 15:05  MJT12044  阅读(140)  评论(0编辑  收藏  举报