hdu Robberies 概率DP

做法:直接背包搞之,背包的容量是当前获得的钞票数

#include<cstdio>
#include<cstring>
const int LMT=102;
double safe[LMT],dp[LMT*LMT];
int M[LMT];
void init(void)
{
    memset(dp,0,sizeof(dp));
    dp[0]=1.0;
}
int main(void)
{
    int T,n,end,ans,i,j;
    double p,x,tem;
    scanf("%d",&T);
    while(T--)
    {
        init();
        end=0;
        scanf("%lf%d",&p,&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&M[i]);
            end+=M[i];
            scanf("%lf",&x);
            safe[i]=1-x;
        }
        for(i=0;i<n;i++)
            for(j=end;j>=M[i];j--)
                if(dp[j]<(tem=dp[j-M[i]]*safe[i]))
                    dp[j]=tem;
        for(i=0;i<=end;i++)
            if(1-dp[i]<p)ans=i;
            printf("%d\n",ans);
    }
    return 0;
}


 

你可能感兴趣的:(hdu Robberies 概率DP)