hdu Robberies

这道题目应该在理解上会有一点问题。这道题的概率不是用来加的,而是用来乘的。这道题要的是在能逃跑的前提下,获得的最大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

 

posted @ 2015-04-02 20:09  Run_For_Love  阅读(220)  评论(0编辑  收藏  举报