UVA - 11181 (bfs)

43 篇文章 0 订阅
17 篇文章 0 订阅

、题目网址‘点击打开链接

你会发现这

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
答案是这样出来的,以第一组为例  第一个人 的ans=(a/b)

a=0.1*0.2*0.7+0.1*0.8*0.3

b=0.1*0.2*0.7+0.1*0.8*0.3+0.9*0.2*0.3;    三个数的b是一样的,a是选择


我当时觉得这是个排列组合一定超时,无法写,,

后来看题解,发现是可以用dfs的,方案思路跟选择一样

#include <iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>

using namespace std;
int n,r;
const int maxn=200+5;
double s[maxn];
double res;
double ans[maxn];//存储每个人被选择的概率
double dfs(int t,int k,double p )
{
    if(t>=n)
    {
        if(k!=0)//z注意k 此时的r如果没有凑够人,则证明这种选择方案不可行,返回0
            return 0;
        else
            return p;
    }
   double sum=0;
    if(k)
    {
        sum+=dfs(t+1,k-1,p*s[t]); //选择这个人,
        ans[t]+=sum;
    }
  //  cout<<sum<<endl;
    sum+=dfs(t+1,k,p*(1-s[t]));//不选这个人
    return sum;

}
int main()
{
   int k=0;
    while(cin>>n>>r&&n)
    {
        k++;
        memset(ans,0,sizeof(ans));
        for(int i=0;i<n;i++)
          cin>>s[i];
        double p=dfs(0,r,1);//总概率
        printf("Case %d:\n",k);
        for(int i=0;i<n;i++)
            printf("%.6f\n",ans[i]/p);
    }

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值