UVA

来源:互联网 发布:nginx 1.12.0 配置 编辑:程序博客网 时间:2024/06/07 13:14

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

你会发现这

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;}



原创粉丝点击