首页 > 代码库 > hdu 4336 Card Collector

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_back12 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位是否为124                 dp[i]+=dp[i|(1<<j)]*p[j];25                 tmp+=p[j];26             }27 28             dp[i]/=tmp;29         }30         printf("%.6lf\n",dp[0]);31     }32 }