hdu2955

/*
分析:
    01背包小变异。
dp[i][l]=min(dp[i-1][l],dp[i-1][l-E[i].m]+E[i].p*(1-dp[i-1][l-E[i].m]))。


                                                           2012-05-10
*/








#include"stdio.h"
#include"string.h"
double min(double a,double b)
{
	return a>b?b:a;
}
int main()
{
    int T;
    int n;
    double P;
    struct A
    {
        int m;
        double p;
    }E[111];
    int i,l,sum;
    double dp[10011];
    int flag[10011];
    
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%d",&P,&n);
        sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d%lf",&E[i].m,&E[i].p);
            sum+=E[i].m;
        }
        for(l=1;l<=sum;l++)	flag[l]=-1;
        flag[0]=1;


		for(l=1;l<=sum;l++)	dp[l]=1;
		dp[0]=0; 
        for(i=1;i<=n;i++)
        {
            for(l=sum;l-E[i].m>=0;l--)
            {
				if(flag[l-E[i].m]!=1)	continue;
                dp[l]=min(dp[l],dp[l-E[i].m]+E[i].p*(1-dp[l-E[i].m]));
                flag[l]=1;
            }
        }


        for(l=sum;l>=0;l--)
        {
            if(dp[l]<=P&&flag[l]==1)
            {
                printf("%d\n",l);
                break;
            }
        }
    }
    return 0;
}


你可能感兴趣的:(hdu2955)