func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long min(long long x, long long y) { return x < y ? x : y; }   inline long long max(long long x, long long y) { return x > y ? x : y; }   const int Maxn = 1e4 + 5;   int n, k, m, ans = -1;   int a[Maxn], b[105], c[30], dis[30][Maxn], f[2000005], pw[30];   bool inq[Maxn];   void SPFA(register int x, register int p) {     dis[p][x] = 0;     queue<int> q;     q.push(x);     while (!q.empty()) {       x = q.front();       q.pop();       inq[x] = false;       for (register int i = 1, nx; i <= m; i++) {         nx = x + b[i];         if (nx <= n + 1)           if (dis[p][x] + 1 < dis[p][nx]) {             dis[p][nx] = dis[p][x] + 1;             if (!inq[nx]) {               q.push(nx);               inq[nx] = true;             }           }         nx = x - b[i];         if (nx > 0)           if (dis[p][x] + 1 < dis[p][nx]) {             dis[p][nx] = dis[p][x] + 1;             if (!inq[nx]) {               q.push(nx);               inq[nx] = true;             }           }       }     }   }   int main() {     pw[0] = 1;     for (int i = 1; i <= 25; i++) pw[i] = pw[i - 1] << 1;     memset(dis, 0x3f, sizeof(dis));     int pos, siz = 0;     cin >> n >> k >> m;     for (int i = 1; i <= k; i++) {       scanf( %d , &pos);       a[pos] = 1;     }     for (int i = 1; i <= m; i++) scanf( %d , &b[i]);     for (int i = 0; i <= n; i++)       if (a[i + 1] != a[i]) {         c[++siz] = i + 1;         SPFA(i + 1, siz);       }     n = siz;     memset(f, 0x3f, sizeof(f));     f[0] = 0;     int nx;     for (int i = 0; i < pw[n] - 3; i++)       for (int j = 1; j < n; j++)         for (int k = j + 1; k <= n; k++) {           if ((i & pw[j - 1]) || (i & pw[k - 1])) continue;           nx = i | pw[j - 1] | pw[k - 1];           f[nx] = min(f[nx], f[i] + dis[j][c[k]]);         }     if (f[pw[n] - 1] == 0x3f3f3f3f) f[pw[n] - 1] = -1;     cout << f[pw[n] - 1] << endl;     return 0;   }   