码迷,mamicode.com
首页 > 其他好文 > 详细

hdu Robberies

时间:2015-04-02 20:50:09      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

这道题目应该在理解上会有一点问题。这道题的概率不是用来加的,而是用来乘的。这道题要的是在能逃跑的前提下,获得的最大money,而题目中给的概率是被抓的概率,所以要先有一个预处理,之后只要列出状态转移方程就可以轻松解决了:dp[i]=max{dp[i],dp[i-v[i]]*p[i]},注意初始条件,dp[0]=1,因为若抢劫金额为0的话,那么逃跑的概率就是1.

技术分享
#include"iostream"
#include"stdio.h"
#include"cmath"
#include"algorithm"
#include"string.h"
#define mx 100005
using namespace std;
double p[mx],dp[mx];
int sum[mx],v[mx];
double max(double a,double b)
{
    return a>b?a:b;
}
int main()
{
   int t,n,i,j;
   double P;
   cin>>t;
   while(t--)
   {
       scanf("%lf%d",&P,&n);
       P=1-P;//最大的逃跑率
       sum[0]=0;
       for(i=1;i<=n;i++)
       {
           cin>>v[i]>>p[i];
           p[i]=1-p[i];//逃跑的概率
           sum[i]=sum[i-1]+v[i];
       }
       memset(dp,0.0,sizeof(dp));
       dp[0]=1;
       for(i=1;i<=n;i++)
       {
           for(j=sum[n];j>=v[i];j--)
           {
               dp[j]=max(dp[j],dp[j-v[i]]*p[i]);
           }
       }
       for(i=sum[n];i>=1;i--)
        if(dp[i]>P) break;
       cout<<i<<endl;
   }
   return 0;
}
View Code

 

hdu Robberies

标签:

原文地址:http://www.cnblogs.com/acm-jing/p/4388239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!