uva11181(概率)

来源:互联网 发布:软件下载页面打不开 编辑:程序博客网 时间:2024/06/10 04:57
题意:
题目意思就是超市有n个人,每个人都有购物的概率;
问我们刚好有r个人购物,且包含第i个人的概率(打印出所有i)


思路:
首先我们要求出只有k个人的概率p1;
再求出只有k个人,且包含i的概率p2;
p1/p2就是我们要求的概率;

我们求概率可以用dfs;在我们找出r个人后,还要乘上剩下的人都没购物的概率;


ac:

#include<cstdio>#include<cstring>const int N = 25;double p[N];int vis[N];int n,r;double dfs(int k, int num ,int cur) {double temp;if(k == num) {temp = 1.0;for(int i = 0 ; i < n ;i++) {if(!vis[i])temp *= (1.0 - p[i]);}return temp;}temp = 0;for(int i = cur ; i < n ; i++) {if(!vis[i]) {vis[i] = 1;temp += dfs(k + 1 ,num ,i + 1) * p[i];vis[i] = 0;}}return temp;}int main() {int cas = 1;while(scanf("%d%d",&n,&r) && n && r) {memset(vis , 0 ,sizeof(vis));double p1,p2;for(int i = 0 ; i < n ; i++) {scanf("%lf",&p[i]);}printf("Case %d:\n",cas++);p1 = dfs(0 , r , 0);for(int i = 0 ; i < n ; i++) {vis[i] = 1;p2 = dfs(0 , r - 1 , 0) * p[i];printf("%.6lf\n",p2 / p1);vis[i] = 0;}}}


0 0