Record,本地跑得出0,洛谷却跑出了-1.
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+25;
int f[1<<17];
int k,n;
int a[30],b[N],s[N];
inline int find(int l,int r,int p){
int st=s[l],res=l;
while(l<=r){
int mid=(l+r)/2;
if(s[mid]-st<=p)res=l,l=mid+1;
else r=mid-1;
}
return res;
}
int ans=-1;
signed main(){
//freopen("3094_4.in","r",stdin);
//freopen("test.out","w",stdout);
cin>>k>>n;
for(int i=1;i<=k;++i)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
//sort(b+1,b+1+n);
for(int i=1;i<=n;i++)
s[i]=s[i-1]+b[i];
for(int i=0;i<=(1<<k);i++){
for(int j=1;j<=k;++j){
if((i>>(j-1))&1)continue;
f[i|(1<<(j-1))]=max(f[i|(1<<(j-1))],find(f[i],n,a[j]));
}
//cout<<f[i]<<endl;
if(f[i]==n){
int cnt=0;
ans=max(ans,cnt);
for(int j=1;j<=k;++j){
if((i>>(j-1))&1)continue;
else cnt+=a[j];
ans=max(ans,cnt);
//cout<<cnt<<endl;
}
}
}
cout<<ans<<endl;
}