#include #define price 0 #define avail 1 int v[60][125][2]; int nv[60]; int n, w; int tab[60][400]; int min(int a, int b) { if (a < b) return a; return b; } int findb(int step, int total_value, int spots_left) { int max_v, max_single_v, x; int i; if (tab[step][spots_left] != 0) return tab[step][spots_left]; if (step == w+1) return total_value; if (spots_left == 0 && step != 0) return total_value; max_v = max_single_v = -1; for (i = 0; i < nv[step]; i++) { x = v[step][i][price]*min(spots_left, v[step][i][avail]) + findb(step+1, total_value, spots_left - min(spots_left, v[step][i][avail])); // printf("DB:: Chosen %d, value %d, tot_value %d, spots_ava %d\n", step, v[step][i][price], x, spots_left - min(spots_left, v[step][i][avail])); if (x >= max_v) { max_v = x; max_single_v = v[step][i][price]; } else if (x == max_v && v[step][i][price] < max_single_v) { max_single_v = v[step][i][price]; } } if (step == 0) { printf("%d\n%d\n", max_v, max_single_v); return 0; } return tab[step][spots_left] = max_v; } int main() { int i, j; scanf (" %d %d", &n, &w); for (i = 0; i <= w; i++) { scanf (" %d", &nv[i]); for (j = 0; j < nv[i]; j++) scanf (" %d", &v[i][j][price]); for (j = 0; j < nv[i]; j++) scanf (" %d", &v[i][j][avail]); } return findb(0, 0, n); }