1. 程式人生 > WINDOWS開發 >ACWING-171-送禮物-雙向搜尋

ACWING-171-送禮物-雙向搜尋

#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);
}
void
dfs2(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; }