【UVA 11181】(条件概率)

本文解析了UVA-11181题目,通过概率论中的条件概率计算方法,给出了n个人中r人购物的具体概率计算过程,并提供了一段使用Java实现的参考代码。

题链:https://cn.vjudge.net/problem/UVA-11181

题意


n个人去了超市,已知每个人买东西的概率为p[i],在已知有r个人买了东西的情况下,求实际上每个人买东西的概率

题解


设r个人买东西的时间为E
\[ans=p(i\;|\;E)=\frac{p(iE)}{p(E)}\]
每个人买东西的概率是独立的,在一种r情况下,利用乘法原理即可。
多种r情况是互斥的,累加起来即可。

参考代码

import java.io.*;
import java.util.*;

public class Main {
    static final int N=(int)5005;
    static double p[]=new double[25];
    static boolean vis[]=new boolean[25];
    static int n,r;
    static double sum[]=new double[25];
    static void dfs(int step,int cnt,double res) {
        if(step==n+2||cnt>r) return;
        if(step==n+1&&cnt==r) {
            sum[0]+=res;
            for(int i=1;i<=n;i++) if(vis[i]) {
                sum[i]+=res;
            }
            return;
        }
        vis[step]=false;
        dfs(step+1,cnt,res*(1-p[step]));
        vis[step]=true;
        dfs(step+1,cnt+1,res*p[step]);
    }
    public static void main(String[] args) {  
        InputStream sys=System.in;
        InputReader in=new InputReader(sys);
      //  Scanner sc=new Scanner(new InputStreamReader(sys));
        PrintWriter out=new PrintWriter(System.out);
        int T=1;
        while(true) {
            n=in.nextInt();r=in.nextInt();
            if(n==0&&r==0) break;
            for(int i=1;i<=n;i++) {
                 p[i]=in.nextDouble();
                 vis[i]=false;sum[i]=0;
            }
            sum[0]=0;
            dfs(1,0,1);
            StringBuffer ans=new StringBuffer();
            for(int i=1;i<=n;i++) {
                  ans.append(String.format("%.6f\n", sum[i]/sum[0]));   
            }
            out.println("Case "+(T++)+":");
            out.print(ans);
            out.flush();
        }
    }
    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;
        
        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }
        
        public double nextDouble() {
            return Double.parseDouble(next());
        }
    }
}

转载于:https://www.cnblogs.com/zsyacm666666/p/7350018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值