#include <stdio.h> #include <string.h> #define MAX 200 int f[MAX], v_max; int _max(int a, int b){ return a > b ? a : b;} void ZeroOnePack(int cost, int weight) { for(int v = v_max; v >= cost; v--) f[v] = _max(f[v], f[v - cost] + weight); } void CompletePack(int cost, int weight) { for(int v = cost; v <= v_max; v++) f[v] = _max(f[v], f[v - cost] + weight); } void MultiplePack(int cost, int weight, int amount) { if(cost * amount > v_max){ CompletePack(cost, weight); return ; } int k = 1; while(k < amount){ ZeroOnePack(k * cost, k * weight); amount -= k; k <<= 1; } ZeroOnePack(amount * cost, amount * weight); } int main() { int cases, n, m, c, w, a, ans; scanf("%d", &cases); while(cases--) { memset(f, 0, sizeof(f)); scanf("%d%d", &n, &m); v_max = n; for(int i=1; i<=m; i++){ scanf("%d%d%d", &c, &w, &a); MultiplePack(c, w, a); } ans = 0; for(int i=0; i<=v_max; i++) if(ans < f[i]) ans = f[i]; printf("%d\n", ans); } return 0; }