比赛 2025.5.4 评测结果 AAAAAAAAAT
题目名称 送礼物 最终得分 90
用户昵称 djyqjy 运行时间 8.045 s
代码语言 C++ 内存使用 18.07 MiB
提交时间 2025-05-04 09:17:49
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
inline int re()
{
    int f=1,num=0;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    return num*f;
}
const int N=50;
int g[N];
int w,n;
vector<int> vec1,vec2;
void dfs(int c,int up,int z)
{
    if(c>up)
    {
        vec1.push_back(z);
        return;
    }
    dfs(c+1,up,z);
    if(w-z>=g[c]) dfs(c+1,up,z+g[c]);
    return;
}
void dfs2(int c,int up,int z)
{
    if(c>up)
    {
        vec2.push_back(z);
        return;
    }
    dfs2(c+1,up,z);
    if(w-z>=g[c]) dfs2(c+1,up,z+g[c]);
    return;
}
int ans;
int main()
{
    freopen("giftgiving.in","r",stdin);
    freopen("giftgiving.out","w",stdout);
    w=re();n=re();
    for(int i=1;i<=n;i++) g[i]=re();
    dfs(1,n/2,0);
    dfs2(n/2+1,n,0);
    sort(vec1.begin(),vec1.end());sort(vec2.begin(),vec2.end());
    for(int i=0,j=vec2.size()-1;i<vec1.size();i++)
    {
        while(vec1[i]>w-vec2[j]&&j>=0) j--;
        if(j<0) break;
        ans=max(ans,vec1[i]+vec2[j]);
    }
    printf("%d",ans);
    return 0;
}