T = gets.to_i N = gets.to_i C = gets.split.take(N).map(&:to_i) V = gets.split.take(N).map(&:to_i) p CV = C.zip(V).sort_by{|c, v| v.fdiv(c)} $dp = {} def f(t, i, va) $dp[[t,i]] ||= if t == 0 || i >= N 0 elsif t < C[i] f(t, i + 1, va) else a = f(t, i + 1, va) v = va[i] _va = va.dup _va[i] /= 2 [a, v + f(t - C[i], i, _va)].max end end p f(T, 0, V)