poj 2151 Check the difficulty of problems

本文介绍了解决POJ2151问题的一种方法,采用背包DP算法结合概率论知识来计算每位选手至少完成一道题目的概率,并通过代码实现给出具体的解答过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:poj 2151 Check the difficulty of problems


背包dp,用到概率的一点知识


dp[ T ][ i ] 表示第T个人解决i个题目的概率,然后答案就是 每个人至少解决1个题的概率相乘 - 每个人都解决1个题目但是小于n的概率相乘

开始我用的是G++交的wa了,找了半天也没找出错误,用C++交就过了,无语……


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

double p[1010][31],dp[1010][31];

int main()
{
    int m,T,n;
    while(scanf("%d%d%d",&m,&T,&n)==3)
    {
        if(!n&&!T&&!m) break;
        for(int i=1;i<=T;i++)
        for(int j=1;j<=m;j++)
           scanf("%lf",&p[i][j]);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=T;i++)
        {
            dp[i][0]=1;
            for(int j=1;j<=m;j++)
            for(int r=m-1;r>=0;r--)
            {
                double pre=dp[i][r];
                dp[i][r]=0;
                dp[i][r+1]+=pre*p[i][j],dp[i][r]+=pre*(1-p[i][j]);
            }
        }
        /*for(int i=1;i<=T;i++)
        {
            for(int j=0;j<=m;j++)
              cout<<dp[i][j]<<" ";
            cout<<endl;
        }*/
        double ans1=1,ans2=1;
        for(int i=1;i<=T;i++)
        {
            double tmp1=0,tmp2=0;
            for(int j=m;j>=1;j--)
            {
                tmp1+=dp[i][j];
                if(j>=n) tmp2+=dp[i][j];
            }
            ans1*=tmp1;
            ans2*=(tmp1-tmp2);
        }
        printf("%.3lf\n",ans1-ans2);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值