定义状态f[x]表示x的报销额下最大能报销的费用,状态转移f[j]=max(f[j],f[j-G[i]]+G[i])。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/8.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=3000000+100;
int f[maxn];
vector<int> G;
int main()
{
double v;
int n;
while(scanf("%lf%d",&v,&n)&&n)
{
memset(f,0,sizeof(f));
G.clear();
char cmd[100];
int m;
double t;
for(int i=0;i<n;i++)
{
int ok=1;
double sum=0;
double a=0,b=0,c=0;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%s",cmd);
char *p=strchr(cmd,':');
int pos=(int)(p-cmd);
t=atof(cmd+pos+1);
if(pos>1) {ok=0;continue;}
if(cmd[0]<'A'||cmd[0]>'C') {ok=0;continue;}
if(pos>1) {ok=0;continue;}
if(cmd[0]=='A') a+=t;
if(cmd[0]=='B') b+=t;
if(cmd[0]=='C') c+=t;
sum+=t;
if(a>600||b>600||c>600||sum>1000) {ok=0;continue;}
}
if(ok) G.push_back((int)(sum*100));
}
for(int i=0;i<G.size();i++)
{
for(int j=(int)(v*100);j>=G[i];j--)
{
f[j]=max(f[j],f[j-G[i]]+G[i]);
}
}
// cout<<f[(int)(v*100)]<<endl;
printf("%.2f\n",(double)f[(int)(v*100)]/100);
}
return 0;
}