比赛 2025.5.4 评测结果 AAAAAAAAAA
题目名称 送礼物 最终得分 100
用户昵称 徐诗畅 运行时间 4.090 s
代码语言 C++ 内存使用 34.60 MiB
提交时间 2025-05-04 09:31:06
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=55;
int n,w,g[N],is[N];
vector<int> a,b;
void dfs(int l,int r,int v,int k){
    for(int i = k;i<=r;i++){
    	if(is[i]||v+g[i]>w) continue; is[i]=1;
    	if(l==1) a.push_back(v+g[i]);
    	else b.push_back(v+g[i]);
    	dfs(l,r,v+g[i],i); is[i]=0;
	}
}
signed main(){
	freopen("giftgiving.in","r",stdin);
	freopen("giftgiving.out","w",stdout);
	scanf("%lld%lld",&w,&n);
	for(int i = 1;i<=n;i++) scanf("%lld",&g[i]);
	dfs(1,n/2,0,1); dfs(n/2+1,n,0,n/2+1);
	a.push_back(0); b.push_back(0);
	sort(a.begin(),a.end());
	int ans=0;
	for(int i = 0;i<b.size();i++){
		/*int l =0,r=a.size()-1;
		while(l<r){
			int mid=(l+r)>>1;
			if(b[i]+a[mid]>w) r=mid-1;
			else l = mid+1;
		}
		ans=max(ans,b[i]+a[l-1]); cout<<b[i]<<" "<<b[i]+a[l]<<" "<<l<<endl;*/
		ans=max(ans,a[upper_bound(a.begin(),a.end(),w-b[i])-a.begin()-1]+b[i]);
	}
	printf("%lld",ans);
}