Problem: My futon

You bought N futons in preparation for your new life. The i-th futon has the warmth supply capacity of si. From the temperature forecast for the next M days, the warmth demand of dj is expected on the jth day. If the warmth is not enough or too much, the comfort will be impaired, so the absolute value of the difference between the sum of the warmth supply capacity of the futon on the j day and the dj is called the discomfort on the j day. To do. I want to make the total discomfort for M days as small as possible.

By the way, your room is unfortunately very small, with only a bed and a closet. Therefore, the only way to add one futon to the bed is to put the futon at the top of the closet on the top of the bed. Conversely, the only way to reduce one bed futon is to put the futon at the top of the bed at the top of the closet. There is no limit to the number of futons that can be moved per day, but only one can be moved at a time.

By the way, you plan to put the futon you bought in the closet. Only at this time can the futons be put in the closet in any order. How do you store your futon in the closet, and then how do you put it in and out every day so that you can spend your days comfortably? When minimizing the sum of discomfort for M days, find the value of that sum. There may be futons that have never been used, and there may be days when no futons are used.

Input

The input consists of multiple datasets. Each dataset has the following format.

> N M
> s1 s2 ... sN
> d1 d2 ... dM

The first line of the dataset is given an integer representing the number of futons N and the number of days M for which the temperature is predicted, separated by spaces. On the second line, N integers s1, s2, ..., sN are given separated by spaces, and si represents the warmth supply capacity of the i-th futon. On the third line, M integers d1, d2, ..., dM are given separated by spaces, and dj represents the warmth demand on day j. These integers satisfy 1 ≤ N ≤ 15, 1 ≤ M ≤ 100, 1 ≤ si, dj ≤ 1,000,000.

The end of the input is represented by a dataset of N = M = 0. Do not output for this dataset.

Output

For each dataset, output the minimum sum of discomfort for M days on one line.

Sample Input


1 1
Five
6
1 1
Five
2
1 1
20
Five
4 1
2 4 5 9
8
4 3
3 5 2 1
10 4 7
5 5
2 2 2 2 2
1 3 5 7 9
twenty five
twenty five
2 5 2 5 2
0 0

Output for Sample Input


1
2
Five
1
1
Five
Four


For the 5th case, put it in the closet with 5, 2, 3, 1 from the top, and take out 3 sheets on the 1st day | 10-(5 + 2 + 3) | = 0, 2 sheets on the 2nd day | 4 -5 | = Take out one sheet on the 1st and 3rd days | 7-(5 + 2) | = 0, for a total of 0 + 1 + 0 = 1.





Example

Input

1 1
5
6
1 1
5
2
1 1
20
5
4 1
2 4 5 9
8
4 3
3 5 2 1
10 4 7
5 5
2 2 2 2 2
1 3 5 7 9
2 5
2 5
2 5 2 5 2
0 0


Output

1
2
5
1
1
5
4

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
struct Fast {
    Fast() {
        std::cin.tie(0);
        ios::sync_with_stdio(false);
        cout.precision(20);
    }
} fast;

/* define */
#define FOR(I, X, Y) for(long long(I) = (X); (I) < (Y); (I)++)
#define REP(I, X, Y) for(long long(I) = (Y)-1; (I) >= (X); (I)--)
#define ALL(X) (X).begin(), (X).end()
#define pb push_back
#define COUNT(V, X)                                                            \
    (upper_bound((V).begin(), (V).end(), X) -                                  \
     lower_bound((V).begin(), (V).end(), X))
#define debug(x) cerr << #x << ':' << x << endl;
#define DEBUG(v)                                                               \
    {                                                                          \
        cerr << #v << ':';                                                     \
        for(auto xv : v) cerr << xv << ' ';                                    \
        cerr << endl;                                                          \
    }
#define Yes(X) cout << (X ? "Yes" : "No") << endl;
#define YES(X) cout << (X ? "YES" : "NO") << endl;
#define ctoi(C) (C - '0')
#define pow2(x) ((long long)((long long)1 << x))

/* alias */
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vii = vector<vector<int>>;
using vl = vector<long long>;
using vll = vector<vector<long long>>;
using pi = pair<int, int>;
using pl = pair<long long, long long>;
template <typename T> using PQ = priority_queue<T>;
template <typename T> using minPQ = priority_queue<T, vector<T>, greater<T>>;

/* const */
const long long dx[] = {1, 0, -1, 0};
const long long dy[] = {0, 1, 0, -1};
const long long dx8[] = {1, 1, 0, -1, -1, -1, 0, 1};
const long long dy8[] = {0, 1, 1, 1, 0, -1, -1, -1};
const long long dx9[] = {1, 1, 0, -1, -1, -1, 0, 1, 0};
const long long dy9[] = {0, 1, 1, 1, 0, -1, -1, -1, 0};
const int INF = 1000000007;
const long long LINF = 1000000000000000007;

/* func */
template <typename T> inline bool chmin(T &a, const T &b) {
    if(a > b) a = b;
    return a > b;
}
template <typename T> inline bool chmax(T &a, const T &b) {
    if(a < b) a = b;
    return a < b;
}
long long max(long long x, int y) {
    return max(x, (long long)y);
}
long long max(int x, long long y) {
    return max((long long)x, y);
}
long long min(long long x, int y) {
    return min(x, (long long)y);
}
long long min(int x, long long y) {
    return min((long long)x, y);
}

/* liblary */

/* main */

map<ll, ll> m;

ll dfs(ll bits, ll &N, ll &M, vl &s, vl &d) {
    if(m[bits]) return m[bits];
    if(bits == 0) return 0;
    FOR(i, 0, N) {
        if(bits == pow2(i)) {
            ll ans = 0;
            FOR(j, 0, M) {
                if(d[j] <= s[i]) ans += min(d[j], s[i] - d[j]);
            }
            return m[bits] = ans;
        }
    }
    ll SUM = 0;
    FOR(i, 0, N) {
        if(bits & pow2(i)) {
            SUM += s[i];
        }
    }
    ll ans = LINF;
    FOR(i, 0, N) {
        if((bits & pow2(i)) == 0) continue;
        ll tmpbits = bits ^ pow2(i);
        ll tmp = dfs(tmpbits, N, M, s, d);
        FOR(j, 0, M) {
            if(SUM - s[i] <= d[j] && d[j] <= SUM) {
                tmp += min(abs(d[j] - SUM + s[i]), abs(d[j] - SUM));
            }
        }
        chmin(ans, tmp);
    }
    return m[bits] = ans;
}

ll solve(ll &N, ll &M, vl &s, vl &d) {
    FOR(i, 0, pow2(15)) m[i] = 0;
    ll bits = pow2(N) - 1;
    ll SUM = 0;
    ll ans = LINF;
    FOR(i, 0, N) SUM += s[i];
    FOR(i, 0, N) {
        ll tmpbits = bits ^ pow2(i);
        ll tmp = dfs(tmpbits, N, M, s, d);
        FOR(j, 0, M) {
            if(SUM - s[i] <= d[j]) {
                tmp += min(abs(d[j] - SUM + s[i]), abs(d[j] - SUM));
            }
        }
        chmin(ans, tmp);
    }
    return ans;
}

signed main() {
    ll N, M;
    while(true) {
        cin >> N >> M;
        if(!N && !M) return 0;
        vl s(N), d(M);
        FOR(i, 0, N) cin >> s[i];
        FOR(i, 0, M) cin >> d[i];
        cout << solve(N, M, s, d) << endl;
    }
}