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