#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 18;
int n, m, a[N], sum[N], coin[M], total, ans = 0x3f3f3f3f;
int dp[1 << M];
int search(int x) {
int L = 0, R = n, res = -1;
while(L <= R) {
int mid = (L + R) >> 1;
if(sum[mid] <= x) { res = max(res, mid); L = mid + 1; }
else R = mid - 1;
}
return res;
}
int main() {
scanf("%d%d", &m, &n);
for(int i = 1; i <= m; i ++ ) {
scanf("%d", coin + i);
total += coin[i];
}
for(int i = 1; i <= n; i ++ ) {
scanf("%d", a + i);
sum[i] = sum[i - 1] + a[i];
}
for(int i = 1; i < (1 << m); i ++ )
for(int j = 1; j <= m; j ++ ) {
int state = i;
if(!(state & (1 << (j - 1)))) continue;
int last = state ^ (1 << (j - 1)), lpos, rpos;
lpos = dp[last];
rpos = search(sum[lpos] + coin[j]);
if(!rpos || rpos <= lpos) continue;
dp[state] = max(dp[state], rpos);
if(rpos == n) ans = min(ans, sum[lpos] + coin[j]);
}
if(ans > 1e9) puts("-1");
else printf("%d\n", total - ans);
return 0;
}
怀疑是更新 ans 的问题