#include #include using namespace std; const int INF = 1 << 28; const int MAX_N = 12; const int MAX_M = 12; int a[MAX_N], b[MAX_M]; bool pack[MAX_M][1 << MAX_N]; int dp[MAX_M][1 << MAX_N]; int main() { int n, m; cin >> n; for (auto i = 0; i < n; i++) { cin >> a[i]; } cin >> m; for (auto i = 0; i < m; i++) { cin >> b[i]; } memset(pack, false, sizeof(pack)); fill((int* )dp, (int* )(dp + m + 1), INF); for (auto b_i = 0; b_i < m; b_i++) { for (auto mask = 0; mask < (1 << n); mask++) { int volume = 0; for (auto a_i = 0; a_i < n; a_i++) { if ((mask >> a_i) & 1) volume += a[a_i]; } if (volume <= b[b_i]) pack[b_i][mask] = true; } } dp[0][0] = 0; for (auto b_i = 1; b_i <= m; b_i++) { for (auto mask = 0; mask < (1 << n); mask++) { for (auto toys = 0; toys < (1 << n); toys++) { if ((mask | toys) != mask || !pack[b_i - 1][toys]) continue; dp[b_i][mask] = min(dp[b_i][mask], dp[b_i - 1][mask & ~toys] + (toys == 0 ? 0 : 1)); } } } auto ans = dp[m][(1 << n) - 1]; if (ans < INF) cout << ans << endl; else cout << -1 << endl; return 0; }