卷题备战CSP-J,调了一晚上为调出来,WA最后一个测试点。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int s(int a,int p){
int sum=1;
while(p--)sum*=a;
return sum;
}
const int N=pow(2,24)+1,inf=1e18;
int w,n,a[55],b[N],c[N],p1,p2,ansx=-inf;
void dfs1(int p,int cnt){
if(p>n/2){
b[++p1]=cnt;
return ;
}
dfs1(p+1,cnt);
dfs1(p+1,cnt+a[p]);
}
void dfs2(int p,int cnt){
if(p>n){
c[++p2]=cnt;
return ;
}
dfs2(p+1,cnt);
dfs2(p+1,cnt+a[p]);
}
signed main(){
// freopen("xxx.in","r",stdin);
// freopen("xxx.out","w",stdout);
cin>>w>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
dfs1(1,0);
dfs2(n/2+1,0);
sort(b+1,b+1+p1);
sort(c+1,c+1+p2);
for(int i=1;i<=p1;i++){
int l=1,r=p2,temp=0;
while(l<=r){
int mid=(l+r)>>1;
if(b[i]+c[mid]<=w){
l=mid+1;
temp=mid;
}else r=mid-1;
}
ansx=max(ansx,b[i]+c[temp]);
}
cout<<ansx<<"\n";
return 0;
}