首页 > 代码库 > uva 11181 - Probability|Given
uva 11181 - Probability|Given
条件概率公式:P( A|B ) = P( AB ) / P( B )
表示在事件B发生的前提下,事件A发生的概率;
对本道题:
设事件E:r个人买了东西;
事件Ei:第i个人买了东西;
则要求的是P( Ei | E );
计算P( E ) 用全概率公式即可,采用递归枚举出所有r个人买东西的情况,然后计算出其总的概率;
计算P( Ei ) 就是在上面递归枚举的过程中将选上第i个人的情况的概率加起来;(在这种情况下,其概率就是:在E发生的前提下的概率)
代码:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn = 21; int n,r; double a[maxn],p[maxn],tot; int vis[maxn]; void dfs(int cur,int cnt) { if(cur==n+1) { if(cnt==r) { double sum=1; for(int i=1;i<=n;i++) { if(vis[i]) sum*=a[i]; else sum*=(1-a[i]); } for(int i=1;i<=n;i++) { if(vis[i]) p[i]+=sum; } tot+=sum; } return; } vis[cur]=1; dfs(cur+1,cnt+1); vis[cur]=0; dfs(cur+1,cnt); } int main() { int kase = 0; while(scanf("%d%d",&n,&r)!=EOF) { kase++; if(n==0&&r==0) break; for(int i=1;i<=n;i++) scanf("%lf",&a[i]); tot=0; memset(vis,0,sizeof(vis)); memset(p,0,sizeof(p)); dfs(1,0); printf("Case %d:\n",kase); for(int i=1;i<=n;i++) { printf("%lf\n",p[i]/tot); } } return 0; }
又比人家慢了点,用时多了点...
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。