UVa 11181 - Probability|Given 概率
2014-10-13 14:55
525 查看
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2122
题目大意:几个朋友去 市买东西,其中对于N 个东西中每个东西都有一个 买的概率,问从中买M 个东西,其中包含 第I个东西的概率。
解题思路:对N 个东西,随机取出来M 个,用 深搜实现,在搜的过程中,用vis数组标记 搜的元素的位置,等搜到M个,把搜到的每个物品的概率相乘就是该情况的概率,同时该种情况下 出现的M 个东西的概率也是这个概率,分别加到 出现的物品上,最后用每个物品的概率/总概率就是所求。
代码如下:
题目大意:几个朋友去 市买东西,其中对于N 个东西中每个东西都有一个 买的概率,问从中买M 个东西,其中包含 第I个东西的概率。
解题思路:对N 个东西,随机取出来M 个,用 深搜实现,在搜的过程中,用vis数组标记 搜的元素的位置,等搜到M个,把搜到的每个物品的概率相乘就是该情况的概率,同时该种情况下 出现的M 个东西的概率也是这个概率,分别加到 出现的物品上,最后用每个物品的概率/总概率就是所求。
代码如下:
#include<stdio.h> #include<cstring> #define N 30 int n,r; double p ,pt ,ans; int v ; void dfs(int k,int cnt) { if(cnt==r) { double temp=1.0; for(int i=1;i<=n;i++) if(v[i]) temp*=p[i]; else temp*=(1-p[i]); ans+=temp; for(int i=1;i<=n;i++) if(v[i]) pt[i]+=temp; } else { for(int i=k+1;i<=n;i++) { v[i]=1; dfs(i,cnt+1); v[i]=0; } } } int main() { int cas=1; while(scanf("%d%d",&n,&r)) { if(n==0&&r==0) break; memset(v,0,sizeof(v)); memset(pt,0,sizeof(pt)); for(int i=1; i<=n; i++) scanf("%lf",&p[i]); printf("Case %d:\n",cas++); if(r==0) { for(int i=1; i<=n; i++) printf("0.000000\n"); continue; } ans=0; dfs(0,0); for(int i=1;i<=n;i++) printf("%.6lf\n",pt[i]/ans); } return 0; }
相关文章推荐
- uva 11181 - Probability|Given(概率)
- UVA - 11181 Probability|Given(条件概率+dfs枚举组合)
- UVA 11181 Probability|Given (离散概率)
- 【UVA】11181 - Probability|Given(条件概率)
- UVA - 11181 Probability|Given (dfs处理条件概率)
- UVA - 11181 Probability|Given 概率 + 递归枚举子集
- UVA-11181 Probability|Given(概率)
- UVA 11181 Probability|Given 概率
- UVa 11181 - Probability|Given (条件概率)
- UVA.11181 Probability|Given (概率)
- uva 11181 Probability|Given 条件概率
- Probability|Given - UVa 11181 概率dp
- UVA 11181(C) ——Probability|Given (条件概率, dfs求组合)
- Uva - 11181 Probability|Given (条件概率)
- uva 11181 - Probability|Given(概率)
- UVa 11181 (条件概率) Probability|Given
- Uva 11181 Probability|Given(概率dp)
- UVA 11181 - Probability|Given (概率DFS)
- UVA 11181 Probability|Given
- UVA 11181 Probability|Given