Hdu 2955 - Robberies

0-1背包问题

 

 

状态转移方程:

dp[j]=max(dp[j],dp[j-m[i]]*(1-q[i]))
其中,dp[j] 表示抢了 j 块大洋之后的最大逃脱概率,条件是 dp[j-m[i]] 能够到达,即:之前抢劫过。
初始化 dp[0]=1,其余的都是 0 或 -1 (什么都别不抢肯定不会被抓)!

AC代码:

#include <stdio.h>
#include <string.h>
double max(double a,double b)
{
    if(a>b) 
        return a;
    else
        return b;
}
double q[1000];
double dp[100000];
int m[1000];
int main()
{
    int T,i,j,sum,N;
    double P;
    scanf("%d",&T);
    while (T--)
    {
    
        
            sum=0;
            //double P;
            scanf("%lf %d",&P,&N);
            for(i=0;i<N;i++)
            {
                scanf("%d %lf",&m[i],&q[i]);
                sum+=m[i];
            }
        
        memset(dp,0,sizeof(dp));
        dp[0]=1.0;
        for(i=0;i<N;i++)
            for(j=sum;j>=m[i];j--)
            {
                dp[j]=max(dp[j],dp[j-m[i]]*(1-q[i]));
            }
            for(j=sum;j>=0;j--)
            {
                if(dp[j]>=(1-P))
                {
                    printf("%d\n",j);
                    break;
                }
            }
        
    }
    return 0;
}


你可能感兴趣的:(Hdu 2955 - Robberies)