比赛 |
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;
}