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