题意略。把数据处理出来就是个裸背包。p:RE要注意把数组开到3000500左右即可。
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <time.h>
#include <vector>
#include <cstdio>
#include <string>
#include <iomanip>
///cout << fixed << setprecision(13) << (double) x << endl;
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define ls rt << 1
#define rs rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define Mp(a, b) make_pair(a, b)
#define asd puts("asdasdasdasdasdf");
typedef long long ll;
//typedef __int64 LL;
const int inf = 0x3f3f3f3f;
const int N = 3000050;
const ll mod = 1e9+7;
int dp[N];
int v[N], w[N];
double Q;
int q, n;
int main()
{
while( ~scanf("%lf%d", &Q, &n ) && n ) {
q = (int) (Q*100);
int cnt = 0;
for( int i = 1, m; i <= n; ++i ) {
char tp;
double sum = 0, tmp;
double sum1 = 0, sum2 = 0, sum3 = 0;
bool OK = 1;
scanf("%d", &m);
getchar();
for( int j = 1; j <= m; ++j ) {
scanf("%c%*c%lf", &tp, &tmp );
getchar();
if( !OK )
continue;
if( tp != 'A' && tp != 'B' && tp != 'C' ) {
OK = 0;
continue;
}
else if( tp == 'A' )
sum1 += tmp;
else if( tp == 'B' )
sum2 += tmp;
else if( tp == 'C' )
sum3 += tmp;
sum += tmp;
if( sum > 1000 || sum1 > 600 || sum2 > 600 || sum3 > 600 )
OK = 0;
}
if( OK ) {
w[++cnt] = (int) ( sum * 100 );
v[cnt] = w[cnt];
}
}
memset( dp, 0, sizeof( dp ) );
for( int i = 1; i <= cnt; ++i ) {
for( int j = q; j >= v[i]; --j ) {
dp[j] = max( dp[j], dp[j-v[i]] + w[i] );
}
}
int ans = 0;
for( int i = 1; i <= q; ++i )
ans = max( ans, dp[i] );
printf("%.02f\n", (double)ans / 100.0);
}
return 0;
}