注意事项:
1.数组至少要开到3000050;
2.是单类物品不能超过600元,不是单项,如A:310 A:320,那A类物品为630元,不符合要求,不能报销;
3.用scanf()读入的话,要先读掉类型字符前的一个空格。
代码:
#include<stdio.h>
#include<string.h>
#define max(x,y) (x>y?x:y)
int main()
{
double q;
int n,dp[3000050];
while(~scanf("%lf%d",&q,&n))
{
if(n==0)
break;
char c,d;
double mag[3];
int sum=(int)(q*100);
int i,j,k,t=1,a[100],flag;
double b;
for(i=1;i<=n;i++)
{
scanf("%d",&k);
flag=1;
for(j=0;j<=2;j++)
mag[j]=0;
while(k--)
{
scanf(" %c:%lf",&c,&b);
if(c=='A')
{
if(mag[0]+b<=600)
mag[0]=mag[0]+b;
else
flag=0;
}
else if(c=='B')
{
if(mag[1]+b<=600)
mag[1]=mag[1]+b;
else
flag=0;
}
else if(c=='C')
{
if(mag[2]+b<=600)
mag[2]=mag[2]+b;
else
flag=0;
}
else
flag=0;
}
if((mag[0]+mag[1]+mag[2])<=1000&&flag)
a[t++]=int((mag[0]+mag[1]+mag[2])*100);
}
memset(dp,0,sizeof(dp));
for(i=1;i<t;i++)
for(j=sum;j>=a[i];j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
double temp=double(dp[sum]);
printf("%.2lf\n",temp/100);
}
}