#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mp make_pair #define mt make_tuple #define pb push_back #define rep(i, n) for (int i = 0; i < (n); i++) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair pii; const int INF = 1 << 29; const double EPS = 1e-9; const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1}; int T,N; vector C; vector V; int dp[20][10010][11]; int memo(int pos, int sum, int cnt, int value){ if (pos == N){ return 0; } if (sum > T)return 0; int &res = dp[pos][sum][cnt]; if (res >= 0){ return res; } res = 0; if (value > 0 and sum + C[pos] <= T){ res = max(res, memo(pos, sum + C[pos], cnt + 1, value / 2) + value); } res = max(res, memo(pos + 1, sum, 0, V[pos + 1])); return res; } int main(){ cin >> T; cin >> N; C.resize(N); V.resize(N); for (int i = 0; i < N; i++){ cin >> C[i]; } C.push_back(-1); for (int i = 0; i < N; i++){ cin >> V[i]; } V.push_back(-1); memset(dp, -1, sizeof(dp)); cout << memo(0, 0, 0, V[0]) << endl; }