题目链接
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 50;
int we[1<<25],idx=0;
int n,m,res=0,k=0;
int w[N];
void dfs1(int u,int s)
{
if(u>=k)
{
we[idx++]=s;
return ;
}
dfs1(u+1,s);
if(s+w[u]<=m)dfs1(u+1,s+w[u]);
}
void dfs2(int u,int s)
{
if(u>=n)
{
int l=0,r=idx-1;
while(l<r)
{
int mid=l+r+1>>1;
if(we[mid]+s<=m)l=mid;
else r=mid-1;
}
res=max(res,we[l]+s);
return ;
}
dfs2(u+1,s);
if(s+w[u]<=m)dfs2(u+1,s+w[u]);
}
signed main()
{
cin>>m>>n;
for(int i=0;i<n;i++)cin>>w[i];
sort(w,w+n,greater<int>());
k=n/2;
dfs1(0,0);
sort(we,we+idx);
idx=unique(we,we+idx)-we;
dfs2(k,0);
cout<<res<<endl;
}