hdu 4336 Card Collector

有n种卡片,概率分别为p1...pn,p1+...+pn<=1

每个袋子最多一张卡片,也可以没有

这题巧妙的用到了整数的二进制

 1 #include<iostream>
 2 #include<string>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<queue>
 6 #include<stack>
 7 #include<algorithm>
 8 #include<cstring>
 9 #include<stdlib.h>
10 using namespace std;
11 #define pb push_back
12 double dp[1<<21],p[22];
13 int main(){
14     int n;
15     while(cin>>n){
16         for(int i=0;i<n;i++)
17             scanf("%lf",&p[i]);
18         dp[(1<<n)-1]=0;
19         for(int i=(1<<n)-2;i>=0;i--){
20             double tmp=0;
21             dp[i]=1;
22             for(int j=0;j<n;j++){
23                 if(i&(1<<j)) continue; //i转化成二进制后,从右边开始数第j位是否为1
24                 dp[i]+=dp[i|(1<<j)]*p[j];
25                 tmp+=p[j];
26             }
27 
28             dp[i]/=tmp;
29         }
30         printf("%.6lf
",dp[0]);
31     }
32 }
原文地址:https://www.cnblogs.com/ainixu1314/p/3883560.html