module main; // https://kmjp.hatenablog.jp/entry/2015/02/27/0900 より // 動的計画法 import std; alias S = Tuple!(int, int, int); int val(S v) { return v[0] * 1000 + v[1] * 100 + v[2]; } void main() { // 入力 S A, B, C; readln.chomp.formattedRead("%d %d %d", A[0], A[1], A[2]); int DA = readln.chomp.to!int; readln.chomp.formattedRead("%d %d %d", B[0], B[1], B[2]); int DB = readln.chomp.to!int; readln.chomp.formattedRead("%d %d %d", C[0], C[1], C[2]); // 答えの計算 int[S] M; M[A] = 0; auto V = new bool[S][](10_001); V[val(A)][A] = true; int ans = 0, x, r; foreach_reverse (i; 0 .. 10_001) { foreach (key; V[i].keys) { ans = max(ans, M[key]); S k = key; x = DA; r = min(x / 1000, k[0]); x -= r * 1000; k[0] -= r; r = min(x / 100, k[1]); x -= r * 100; k[1] -= r; r = min(x, k[2]); x -= r; k[2] -= r; if (x == 0) { k[0] += B[0]; k[1] += B[1]; k[2] += B[2]; M[k] = max(M.get(k, 0), M[key] + 1); V[val(k)][k] = true; } k = key; x = DB; r = min(x / 1000, k[0]); x -= r * 1000; k[0] -= r; r = min(x / 100, k[1]); x -= r * 100; k[1] -= r; r = min(x, k[2]); x -= r; k[2] -= r; if (x == 0) { k[0] += C[0]; k[1] += C[1]; k[2] += C[2]; M[k] = max(M.get(k, 0), M[key] + 1); V[val(k)][k] = true; } } } // 答えの出力 writeln(ans); }