int n, m; int a[10], b[10], c[10][10], f[10][kMaxS];
intgetbit(int s, int k){ return s / kPw5[k] % 5; }
voiddfs(int x, int cur, int val, int s, int cnt){ if (cur == m) { if (!cnt) f[x][s] = std::min(f[x][s], val); return; } int t = getbit(s, cur); for (int i = 0; i <= std::min(t, cnt); ++i) { dfs(x, cur + 1, val + (bool)i * c[x][cur], s - i * kPw5[cur], cnt - i); } }
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) std::cin >> a[i]; int st = 0; for (int i = 0; i < m; ++i) { std::cin >> b[i]; st += kPw5[i] * b[i]; } for (int i = 1; i <= n; ++i) for (int j = 0; j < m; ++j) std::cin >> c[i][j]; memset(f, 0x3f, sizeof(f)); f[0][st] = 0; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= st; ++j) { dfs(i, 0, f[i - 1][j], j, a[i]); } } int ans = *std::min_element(f[n], f[n] + st + 1); std::cout << (ans >= 1e9 ? -1 : ans) << '\n'; }