比赛 2025.5.4 评测结果 AAAAAAAAAW
题目名称 送礼物 最终得分 90
用户昵称 李奇文 运行时间 3.284 s
代码语言 C++ 内存使用 38.33 MiB
提交时间 2025-05-04 11:33:03
显示代码纯文本
#include<bits/stdc++.h>
#define re register
#define int long long
using namespace std;
const int N=49,M=2e7;
int w,n,ans,endd;
int g[N],hs[M],tb[M];
void dfs(int v,int q,int t){
	if(v>w) return;
	if(q>endd){
		if(t==0) hs[++hs[0]]=v;
		else tb[++tb[0]]=v;
		return;
	}
	dfs(v,q+1,t);
	dfs(v+g[q],q+1,t);
	return;
}
bool cmp(int a,int b){
	return a>b;
}
signed main(){
	freopen("giftgiving.in","r",stdin);
	freopen("giftgiving.out","w",stdout);
	scanf("%lld%lld",&w,&n);
	for(re int i=1;i<=n;++i){
		scanf("%lld",&g[i]);
	}
	sort(g+1,g+1+n,cmp);
	endd=n/2;
	dfs(0,1,0);
	endd=n;
	dfs(0,n/2+1,1);
	sort(tb+1,tb+1+tb[0]);
	for(re int i=1;i<=hs[0];++i){
		ans=max(ans,tb[upper_bound(tb+1,tb+1+tb[0],w-hs[i])-tb-1]+hs[i]);
	}
	printf("%lld",ans);
	return 0;
}