rt,这份双向搜索的代码可以通过本题,然而这份代码的剪枝是错的,hack数据如下:
in:
1 1
1
out : 0
true out : 1
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int n,c,a[1001],s1[1048576],s2[1048576],ans,c1,c2;
void dfs1(int now,int wei){
if(wei>=c) return;
if(now==n/2+1){
s1[++c1]=wei;
return;
}
dfs1(now+1,wei+a[now]);
dfs1(now+1,wei);
}
void dfs2(int now,int wei){
if(wei>=c) return;
if(now==n+1){
s2[++c2]=wei;
return;
}
dfs2(now+1,wei+a[now]);
dfs2(now+1,wei);
}
signed main(){
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
dfs1(1,0);
dfs2(n/2+1,0);
sort(s1+1,s1+1+c1);
ans=s1[c1];
for(int i=1;i<=c2;i++){
int x=c-s2[i];
int k=upper_bound(s1+1,s1+c1+1,x)-s1-1;
ans=max(ans,s1[k]+s2[i]);
}
cout<<ans;
}