ACWING-171-送禮物-雙向搜尋
阿新 • • 發佈:2020-04-13
#include<iostream> #include<algorithm> using namespace std; typedef long long LL; int n,k,cnt; LL w,g[50],sum[1<<24],ans; void dfs1(int cur,LL res){ if(cur==k){ sum[cnt++]=res; return; } if(g[cur]+res<=w)dfs1(cur+1,g[cur]+res); dfs1(cur+1,res); } voiddfs2(int cur,LL res){ if(cur==n){ int left,mid,right; left=0;right=cnt-1; while(left<right){ mid=left+right+1>>1; if(sum[mid]+res<=w)left=mid; else right=mid-1; } if(sum[left]+res<=w)ans=max(ans,sum[left]+res);return; } if(g[cur]+res<=w)dfs2(cur+1,g[cur]+res); dfs2(cur+1,res); } int main(){ cin>>w>>n; for(int i=0;i<n;i++)cin>>g[i]; sort(g,g+n); reverse(g,g+n); k=n/2+2; dfs1(0,0); sort(sum,sum+cnt); int tmp=1; for(int i=1;i<cnt;i++)if(sum[i]!=sum[i-1]) sum[tmp++]=sum[i]; cnt=tmp; dfs2(k,0); cout<<ans<<endl; return 0; }