HDU 2955 Robberies

这题和poj 3628有点像

#include<stdio.h>
#include<string.h>
double max(double g,double h)
{
    return g<h?h:g;
}
int main()
{
    int T;
    scanf("%d",&T);
    double luckyme,unlucky[110];
    int n,money[110];
    double dp[10010];
    int sum;
    while(T--)
    {
        scanf("%lf%d",&luckyme,&n);
        sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%lf",&money[i],&unlucky[i]);
            sum=sum+money[i];
            unlucky[i]=1-unlucky[i];
        }
        for(int i=0;i<=sum;i++)
            dp[i]=0;
        dp[0]=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=sum;j>=money[i];j--)
                dp[j]=max(dp[j],dp[j-money[i]]*unlucky[i]);
        }
        int ans;
        for(int i=sum;i>=0;i--)
        {
            if(1-dp[i]<=luckyme)
            {
                ans=i;
                break;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(HDU-dp)