您的位置:首页 > 其它

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 个东西的概率也是这个概率,分别加到 出现的物品上,最后用每个物品的概率/总概率就是所求。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: