#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair i_i; typedef pair ll_i; typedef pair d_i; typedef pair ll_ll; typedef pair d_d; struct edge { int u, v; ll w; }; ll MOD = 1000000007; int main() { int N; cin >> N; vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; int M; cin >> M; vector B(M); for (int j = 0; j < M; j++) cin >> B[j]; sort(B.begin(), B.end(), greater()); vector a(1 << N); for (int S = 0; S < (1 << N); S++) for (int i = 0; i < N; i++) if (S & (1 << i)) a[S] += A[i]; vector dp(1 << N, INT_MAX / 2); dp[0] = 0; for (int S = 0; S < (1 << N); S++) { int T = S; do { if (dp[T] < M && a[S ^ T] <= B[dp[T]]) dp[S] = min(dp[S], dp[T] + 1); T = (T - 1) & S; } while (T != S); } cout << (dp[(1 << N) - 1] < INT_MAX / 2 ? dp[(1 << N) - 1] : -1) << endl; }