根据题意,首先找到符合条件的发票总额,然后使用DFS找到最大值即可:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int n, m;
double Q, maximum = 0;
void dfs(vector<double> v, int index, double sum){
maximum = max(maximum, sum);
if(index < v.size()){
if(sum + v[index] <= Q) dfs(v, index + 1, sum + v[index]);
dfs(v, index + 1, sum);
}
}
int main(){
while(scanf("%lf%d", &Q, &n) != EOF && n){
double total, price;
char level;
vector<double> v;
for(int i = 0; i < n; i++){
scanf("%d", &m);
total = 0;
bool flag = true;
for(int j = 0; j < m; j++){
scanf(" %c:%lf", &level, &price);
if(price > 600.0 || !strchr("ABC", level)) flag = false;
total += price;
}
if(flag && total <= Q){
v.push_back(total);
}
}
dfs(v, 0, 0);
printf("%.2lf\n", maximum);
}
return 0;
}