#include #include using namespace std; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x c, v; vector>> dp; int calc(int i, int j) { int res = v[i]; for(int loop : range(j)) { res /= 2; } return res; } // 今t時間経った。i番目のアトラクションのj回目(j>=0)に乗ろうか悩んでいる。 // そのときの満足度の最大値を求める。 int rec(int t, int i, int j) { int &res = dp[i][j][t]; if(res != -1) { return res; } if(i == n) { return res = 0; } res = rec(t, i+1, 0); // 乗らない if(t+c[i] <= tt && j < 13) { res = max(res, rec(t+c[i], i, j+1) + calc(i, j)); // 乗る } return res; } int main(void) { scanf("%d%d", &tt, &n); c.resize(n); v.resize(n); for(int i : range(n)) { scanf("%d", &c[i]); } for(int i : range(n)) { scanf("%d", &v[i]); } dp.assign(n+1, vector>(15, vector(tt+1, -1))); int res = rec(0, 0, 0); printf("%d\n", res); return 0; }