/* -*- coding: utf-8 -*- * * 2364.cc: No.2364 Knapsack Problem - yukicoder */ #include #include using namespace std; /* constant */ const int MAX_N = 7; const int MAX_M = 7; const int MAX_K = MAX_N + MAX_M; const int KBITS = 1 << MAX_K; const int MAX_W = 500; /* typedef */ /* global variables */ int as[MAX_N], bs[MAX_N], cs[MAX_M], ds[MAX_M]; int es[MAX_K], fs[MAX_K], dp[KBITS][MAX_W + 1]; /* subroutines */ void setmax(int &a, int b) { if (a < b) a = b; } /* main */ int main() { int n, m, w; scanf("%d%d%d", &n, &m, &w); for (int i = 0; i < n; i++) scanf("%d", as + i); for (int i = 0; i < n; i++) scanf("%d", bs + i); for (int i = 0; i < m; i++) scanf("%d", cs + i); for (int i = 0; i < m; i++) scanf("%d", ds + i); int k = n + m; copy(as, as + n, es); for (int i = 0; i < m; i++) es[i + n] = -cs[i]; copy(bs, bs + n, fs); for (int i = 0; i < m; i++) fs[i + n] = -ds[i]; int kbits = 1 << k; for (int bits = 0; bits < kbits; bits++) fill(dp[bits], dp[bits] + w + 1, -1); dp[0][0] = 0; for (int bits = 0; bits < kbits; bits++) for (int i = 0, bi = 1; i < k; i++, bi <<= 1) if (! (bits & bi)) { int minj = max(0, -es[i]), maxj = min(w, w - es[i]); for (int j = minj; j <= maxj; j++) if (dp[bits][j] >= 0) setmax(dp[bits | bi][j + es[i]], dp[bits][j] + fs[i]); } int maxd = 0; for (int bits = 0; bits < kbits; bits++) for (int j = 0; j <= w; j++) maxd = max(maxd, dp[bits][j]); printf("%d\n", maxd); return 0; }