链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2122

题意:

有n个人准备去超市逛,其中第i个人买东西的概率是Pi。逛完以后你得知有r个人买了东西。
根据这一信息,请计算每个人实际买了东西的概率。
输入n(1≤n≤20)和r(0≤r≤n),输出每个人实际买了东西的概率。

分析:

设“r个人买了东西”这个事件为E,“第i个人买东西”这个事件为Ei,则要求的是条件概率P(Ei|E)。
根据条件概率公式,P(Ei|E) = P(EiE) / P(E)。
P(E)依然可以用全概率公式。例如,n=4,r=2,有6种可能:1100, 1010, 1001, 0110, 0101, 0011,
其中1100的概率为P1*P2*(1-P3)*(1-P4),其他类似,设opt[k]表示第k个人是否买东西(1表示买,0表示不买),
则可以用递归的方法枚举恰好有r个opt[k]=1的情况。
如何计算P(EiE)呢?方法一样,只是枚举的时候要保证第opt[i]=1。
用tot表示E的概率,sum[i]表示opt[i]=1的概率之和,则答案为P(EiE)/P(E)=sum[i]/tot。

代码:

 import java.io.*;
import java.util.*; public class Main {
static final int UP = 20 + 5;
static int n, r;
static double P[] = new double[UP], sum[] = new double[UP];
static boolean opt[] = new boolean[UP]; static void dfs(int d, int s, double prob) { // d为第几个,s为选了几个,prob为当前概率
if(s > r || d - s > n - r) return; // 选的个数超过了限制或者不选的个数超过了限制
if(d == n) {
sum[n] += prob;
for(int i = 0; i < n; i++) if(opt[i]) sum[i] += prob;
return;
}
opt[d] = true;
dfs(d+1, s+1, prob * P[d]);
opt[d] = false;
dfs(d+1, s, prob * (1-P[d]));
} public static void main(String args[]) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
for(int cases = 1; ; cases++) {
n = cin.nextInt();
r = cin.nextInt();
if(n == 0) break;
for(int i = 0; i < n; i++) P[i] = cin.nextDouble(); Arrays.fill(sum, 0);
Arrays.fill(opt, false);
dfs(0, 0, 1); System.out.printf("Case %d:\n", cases);
for(int i = 0; i < n; i++)
System.out.printf("%.6f\n", sum[i] / sum[n]);
}
cin.close();
}
}

最新文章

  1. 使用ab进行压力测试详解
  2. Hadoop总结篇之三---一个Job到底被提交到哪去了
  3. Android permission
  4. mysql时间查看以及定时器相关操作
  5. RPI学习--环境搭建_更新firmware
  6. 【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛
  7. CODEVS 3286 火柴排队
  8. [置顶] Objective-C ,ios,iphone开发基础:在UITextField输入完以后,隐藏键盘,
  9. CSS之清除浮动
  10. 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图
  11. takes 3 positional arguments but 4 were given错误
  12. 打通MySQL的操作权限
  13. 【微服务目录】.NET Core 微服务介绍
  14. laravel5.6中Session store not set on request问题如何解决
  15. 浅谈nodejs和php
  16. C语言数组一种巧妙的使用方式
  17. 解决服务器代码执行mvn test后在classes和test-classes下找不到Spring的bean.xml配置文件问题
  18. 图文并茂 —— 基于Oozie调度Sqoop
  19. odoo-开发笔记 列表视图 增加记录弹出窗口效果
  20. ROS多线程订阅消息

热门文章

  1. 架构实战项目心得(十):基于spring-ladp的统一用户中心结构设计以及代码结构设计
  2. Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动
  3. monodb分片集群部署
  4. 使用 typeof 来检测对象是否undefined
  5. SQL语句整理(一) 数据库查询语言DQL
  6. 二分查找——Python实现
  7. Filter内容
  8. javaweb之jsp的属性范围
  9. Js的核心:找到DOM
  10. html简介(自己理解和老师讲课)