首页 > 其他 > 详细

hdu 4815 Little Tiger vs. Deep Monkey (背包+思维)

时间:2014-04-22 18:57:48      阅读:706      评论:0      收藏:0      [点我收藏+]

  题意:

         由于题目是pdf文档就不上题目了。大意是说。有A,B两个人答题比赛。一共有N道题目(N<=40)每道题有一个分值po[i](0<po[i]<=1000)。现假定B答对每到题的概率为0.5问A至少要得多少分才能保证不输给B的概率不小于P。

思路:

        开始拿到题目的时候以为是概率DP但后来一分析就豁然开朗。我们要算A不输给B的概率。如果我们知道A得每种得分的频数y。和A不小于B得分的频数x.那么p=x/y。先只需x/y>=p。x>=y*p。就行了。因为答每到题有两种可能。所以B得分就有y=2^n种可能。现在关键就是求x了。要使得分最小。我们可以先用背包求出B得每种得分的方案数。让后得分从小到大累加方案数。第一个使得x>=y*p的得分就是最小得分。

详细见代码:

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;

int dp[40100],po[50];
long long need,all;
int main()
{
    int n,i,j,t,sum;
    double p;

    scanf("%d",&t);
    while(t--)
    {
        need=sum=all=0;
        scanf("%d%lf",&n,&p);
        for(i=0;i<n;i++)
            scanf("%d",&po[i]),sum+=po[i];
        memset(dp,0,sizeof dp);
        dp[0]=1,all=1LL<<n;//注意LL
        for(i=0;i<n;i++)//算出每种得分的频数
            for(j=sum;j>=po[i];j--)
                if(dp[j-po[i]])
                    dp[j]+=dp[j-po[i]];
       need=ceil(all*p);//注意向上取整
       for(i=0,all=0;i<=sum;i++)
       {
           all+=dp[i];
           if(all>=need)
           {
               printf("%d\n",i);
               break;
           }
       }
    }
    return 0;
}
目前还是杭电第一的代码哦~bubuko.com,布布扣

bubuko.com,布布扣

hdu 4815 Little Tiger vs. Deep Monkey (背包+思维),布布扣,bubuko.com

hdu 4815 Little Tiger vs. Deep Monkey (背包+思维)

原文:http://blog.csdn.net/bossup/article/details/24305717

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!