module main; // https://kmjp.hatenablog.jp/entry/2015/10/09/1000 より // 動的計画法、ナップザック問題、鳩の巣原理 import std; // aとbを比較してbの方が小さいならばaの値をbに更新する void chMin(T)(ref T a, in T b) { if (a > b) a = b; } void main() { // 入力 long N, M; readln.chomp.formattedRead("%d %d", N, M); auto A = readln.split.to!(long[]); auto K = readln.split.to!(long[]); // 答えの計算 long total = 0; foreach (i; 0 .. N) total += A[i] * K[i]; if (total < M) { writeln(-1); return; } M = total - M; immutable INF = 1L << 60; // 250,000円までの最小枚数をDPで求める auto can = uninitializedArray!(long[])(250_001); can[] = INF; can[0] = 0; long ans = INF; // 250,000円を超える分はA[N-1]円硬貨で払う foreach (i; 0 .. 250_001) { foreach (a; A) if (i - a >= 0) chMin(can[i], can[i - a] + 1); if (i <= M && (M - i) % A[N - 1] == 0) chMin(ans, can[i] + (M - i) / A[N - 1]); } if (ans == INF) ans = -1; // 答えの出力 writeln(ans); }