HDU 4336 Card Collector(概率)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336

题意:有n种硬币,每个硬币出现的概率为pi。每次取一个。求收集n种硬币的取的次数期望。

思路:直接按位枚举 。比如f[1101]=1+p0*f[1100]+p2*f[1001]+p3*f[0101]+(1-p0-p2-p3)*f[1101]。

import java.util.*;

import java.text.*;

import java.math.*;



public class Main{

    

    static double EPS=1e-10;

    static double PI=Math.acos(-1.0);

    

    static double p[]=new double[25];

    static double f[]=new double[1<<20];

    static int n;

    

    

    public static void PR(String s){

        System.out.println(s);

    }

    

    public static void PR(double s)

    {

        java.text.DecimalFormat d=new java.text.DecimalFormat("#.0000000");

        System.out.println(d.format(s));

    }

    

    public static double cal()

    {

        int i,j,k;

        double temp,sum;

        f[0]=0;

        for(i=1;i<(1<<n);i++)

        {

            temp=1; sum=0;

            for(j=0;j<n;j++) if((i&(1<<j))!=0)

            {

                temp+=p[j]*f[i^(1<<j)];

                sum+=p[j];

            }

            f[i]=temp/sum;

        }

        return f[(1<<n)-1];

    }

    

    public static void main(String[] args){

  

        Scanner S=new Scanner(System.in);

        int i;

        while(S.hasNext())

        {

            n=S.nextInt();

            for(i=0;i<n;i++) p[i]=S.nextDouble();

            double ans=cal();

            PR(ans);

        }

    }

}

  

你可能感兴趣的:(Collector)