首页 > Windows开发 > 详细

ACWING-171-送礼物-双向搜索

时间:2020-04-12 18:18:39      阅读:63      评论:0      收藏:0      [点我收藏+]
#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;
} 

 

ACWING-171-送礼物-双向搜索

原文:https://www.cnblogs.com/lyt888/p/12686186.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!