UVA11181 Probability|Given概率+DFS
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA11181 Probability|Given概率+DFS相关的知识,希望对你有一定的参考价值。
N friends go to the local super market together. The probability of their buying something from the market is p1, p2, p3, . . . , pN respectively. After their marketing is finished you are given the information that exactly r of them has bought something and others have bought nothing. Given this information you will have to find their individual buying probability.
Input
The input file contains at most 50 sets of inputs. The description of each set is given below:
First line of each set contains two integers N (1 ≤ N ≤ 20) and r (0 ≤ r ≤ N). Meaning of N and r are given in the problem statement. Each of the next N lines contains one floating-point number pi (0.1 < pi < 1) which actually denotes the buying probability of the i-th friend. All probability values should have at most two digits after the decimal point.
Input is terminated by a case where the value of N and r is zero. This case should not be processes.
Output
For each line of input produce N +1 lines of output. First line contains the serial of output. Each of the next N lines contains a floating-point number which denotes the buying probability of the i-th friend given that exactly r has bought something. These values should have six digits after the decimal point. Follow the exact format shown in output for sample input. Small precision errors will be allowed. For reasonable precision level use double precision floating-point numbers.
Sample Input
3 2
0.10
0.20
0.30
5 1
0.10
0.10
0.10
0.10
0.10
0 0
Sample Output
Case 1:
0.413043
0.739130
0.847826
Case 2:
0.200000
0.200000
0.200000
0.200000
0.200000
问题链接:UVA11181 Probability|Given
问题简述:(略)
问题分析:概率计算问题,不解释。解题代码来自仙客传奇团队。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* UVA11181 Probability|Given */
#include <iostream>
#include <cstdio>
#include <cstring>
const int N = 20 + 1;
double ans[N], p[N];
int n, r;
double dfs(int cur, int cnt, double pp) //通过递归来枚举各种情况
if (cur > n) return cnt? 0:pp;
double sum=0;
if (cnt)
sum += dfs(cur + 1, cnt - 1, pp * p[cur]);
ans[cur] += sum;
sum += dfs(cur + 1, cnt, pp * (1 - p[cur]));
return sum;
int main()
int caseno = 0;
while (~scanf("%d%d", &n, &r) && (n || r))
for (int i = 1; i <= n; i++)
scanf("%lf",&p[i]);
memset(ans, 0, sizeof(ans));
double all = dfs(1, r, 1);
printf("Case %d:\\n", ++caseno);
for (int i = 1; i <= n; i++)
printf("%f\\n", ans[i] / all); //p(a|b)=p(ab)/p(b)
return 0;
以上是关于UVA11181 Probability|Given概率+DFS的主要内容,如果未能解决你的问题,请参考以下文章
UVA11181Probability|Given(条件概率)
UVA 11181 Probability|Given 数学 条件概率