您的位置:首页 > 其它

HDU 4336 Card Collector(概率)

2013-05-05 13:15 204 查看
题目链接: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);
}
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: