比赛 |
20160420s |
评测结果 |
AAAAAAAAAA |
题目名称 |
买汽水 |
最终得分 |
100 |
用户昵称 |
农场主 |
运行时间 |
0.693 s |
代码语言 |
C++ |
内存使用 |
32.28 MiB |
提交时间 |
2016-04-20 10:43:44 |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
long long p[1<<21]={0},q[1<<21]={0},w[41]={0};
int main(){
freopen("drink.in","r",stdin);
freopen("drink.out","w",stdout);
int n,l,r,m;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) scanf("%lld",&w[i]);
l=n/2; r=n-l;
for (int i=0;i<1<<l;i++){
for (int j=0;j<l;j++){
if (i&(1<<j)) p[i]+=w[j];
}
}
sort(p,p+(1<<l)-1);
//for (int i=0;i<1<<l;i++) printf("%d ",p[i]); printf("\n");
for (int i=1;i<1<<r;i++){
for (int j=0;j<r;j++){
if (i&(1<<j)) q[i]+=w[j+l];
}
}
//for (int i=0;i<1<<r;i++) printf("%d ",q[i]); printf("\n");
sort(q,q+(1<<r)-1);
int i=0,j=(1<<r)-1;
long long ans=0;
while (i<(1<<l)&&p[i]<=m){
while ((j>=0&&p[i]+q[j]>m)){
j--;
}
if (j<0) break;
//printf("%d %d\n",i,j);
ans=max(p[i]+q[j],ans);
i++;
}
printf("%lld",ans);
return 0;
}