#include"stdio.h"
#include"string.h"
double min(double a,double b)
{
return a>b?b:a;
}
struct A
{
int m;double p;
}E[111];
int flag[10005];
double dp[11111];
int main ()
{
int T,n,i,l,sum;
double P;
scanf("%d",&T);
while(T--)
{
sum=0;
scanf("%lf%d",&P,&n);
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;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;
}
这道题要注意一下那个flag 这道题不是一遍一遍的搜 要从前往后腿 但是只能是一遍 并且对于一些 l 的数值不一定会用的到 所以在初始化时会设置到1状态 也就是100%会被捕,dp[0]的概念就是从前往后遍历的开始
hdu 2955
最新推荐文章于 2019-10-25 00:06:12 发布