分析:因为这里“背包容量”和“物体的体积”都是有小数的,所有同一乘以100就是整数了,先把所有的符合条件的发票选出来,然后就是01背包问题了。
# include <stdio.h>
# include <string.h>
int Max(int a,int b)
{
return a>b?a:b;
}
int dp[3000005];
int main()
{
int i,j,n,m,f,A,B,C,V,v[32];
double q,x;
char c;
while(scanf("%lf%d",&q,&n),n)
{
V=(int)(100*q);
for(i=1;i<=n;i++)
{
A=B=C=f=0;
scanf("%d",&m);
while(m--)
{
scanf(" %c:%lf",&c,&x);
if(c=='A') A+=(int)(100*x);
else if(c=='B') B+=(int)(100*x);
else if(c=='C') C+=(int)(100*x);
else f=1;
}
if(A>60000||B>60000||C>60000||A+B+C>100000)
f=1;
if(f==1) i--,n--;
else v[i]=A+B+C;
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=V;j>=v[i];j--)
dp[j]=Max(dp[j],dp[j-v[i]]+v[i]);
printf("%.2f\n",dp[V]/100.0);
}
return 0;
}