送礼物【双向bfs】

题目传送门

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=(1<<24)+1;
ll ans,n,m,a[N],s[N],n_2;

void find1(int val)
{
    int l=1,r=n_2;
    ll check=m-val;
    while(r>l)
    {
        int mid=(l+r+1)>>1;
        if(check >= s[mid]) l=mid;
        else r=mid-1;
    }
    ans=max(ans,val+s[r]);
}

void dfs(int u,ll sum)
{
    if(u==n/2+2+1){
        s[++n_2] = sum;
        return;
    }
    if(sum+a[u]<=m) dfs(u+1,sum+a[u]);
    dfs(u+1,sum);
}

void dfs2(int u,ll sum)
{
    if(u==n+1){
        find1(sum);
        return;
    }
    if(sum+a[u]<=m) dfs2(u+1,sum+a[u]);
     dfs2(u+1,sum); // 不能写 else  dfs2(u+1,sum)
}

int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++) cin>>a[i];

    sort(a+1,a+n+1);
    reverse(a+1,a+n+1);

    dfs(1,0);
    sort(s+1,s+n_2+1);
    n_2=unique(s+1,s+n_2+1)-(s+1);
    dfs2(n/2+3,0);
    cout<<ans<<endl;
    return 0;
}

发布了152 篇原创文章 · 获赞 4 · 访问量 3878

猜你喜欢

转载自blog.csdn.net/qq_43716912/article/details/100583976