比赛 |
SBOI2022暑假快乐赛① |
评测结果 |
AWWWWWWWW |
题目名称 |
送礼物 |
最终得分 |
11 |
用户昵称 |
op_组撒头屯 |
运行时间 |
0.036 s |
代码语言 |
C++ |
内存使用 |
1.27 MiB |
提交时间 |
2022-06-25 11:07:43 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=45+5;
typedef long long ll;
const ll inf=0x7fffffff;
int n;
ll g[N],w,ans=0;
ll p[N]={0};
bool cmp(ll x,ll y){
return x>y;
}
void dfs(int pt,ll num){
if (num>w)return ;
if (pt==n/2+1){
p[++p[0]]=num;
return ;
}
dfs(pt+1,num);
dfs(pt+1,num+g[pt]);
return ;
}
void findsum(ll t){
int l=1,r=p[0]+1;
while(l<r){
int mid=(l+r)/2;
if (p[mid]>t)r=mid;
else l=mid+1;
}
ans=max(ans,w-t+p[l-1]);
return ;
}
void dfs2(int pt,ll num){
if (num>w)return ;
if (pt==n+1){
findsum(w-num);
return ;
}
dfs2(pt+1,num);
dfs2(pt+1,num+g[pt]);
return ;
}
int main(){
freopen ("giftgiving.in","r",stdin);
freopen ("giftgiving.out","w",stdout);
scanf("%lld%d",&w,&n);
for (int i=1;i<=n;i++){
scanf("%lld",&g[i]);
}
sort(g+1,g+n+1,cmp);
dfs(1,0);
sort(p+1,p+p[0]+1);
int q=0;
for (int i=1;i<=p[0];i++){
if (p[i]==p[i-1])q++;
else p[i-q]=p[i];
}
p[0]-=q;
p[++p[0]]=inf;
dfs2(n/2+1,0);
printf("%lld\n",ans);
return 0;
}