记录编号 606899 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 4179.毛一琛 最终得分 100
用户昵称 Gravatar梦那边的美好CE 是否通过 通过
代码语言 C++ 运行时间 1.250 s
提交时间 2025-10-04 16:45:41 内存使用 4.76 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,w[30],mid,head[11451419],v[11451419],ans,tot,c,sta,cnt,pos;
struct node{
	int u,val;
}e[214514],edge[11451419];
bool vis[1919810];
void dfs1(int dep,int sum,int state){
	if(dep>mid){
		edge[++tot].u=head[state];
		edge[tot].val=sum;
		head[state]=tot;
		return;
	}
	dfs1(dep+1,sum,state);
	dfs1(dep+1,sum+w[dep],state|(1<<(dep-1)));
	dfs1(dep+1,sum-w[dep],state|(1<<(dep-1)));
}
void dfs2(int dep,int sum,int state){
	if(dep>n){
		e[++c].u=state;
		e[c].val=sum;
		return;
	}
	dfs2(dep+1,sum,state);
	dfs2(dep+1,sum+w[dep],state | (1<<(dep-1)));
	dfs2(dep+1,sum-w[dep],state | (1<<(dep-1)));
}
bool ccp(const node&a,const node&b){
	return a.val<b.val;
}
int main(){
	freopen("subsets.in","r",stdin);freopen("subsets.out","w",stdout);
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;
	mid=(n+1)>>1;sta=(1<<n)-1;
	for(int i=1;i<=n;i++)cin>>w[i];
	dfs1(1,0,0);
	dfs2(mid+1,0,0);
	sort(e+1,e+c+1,ccp);
	for(int i=0;i<=(1<<mid);i++){
		cnt=0;pos=1;
		for(int j=head[i];j;j=edge[j].u)v[++cnt]=edge[j].val;
		sort(v+1,v+cnt+1);
		if(v[1]>e[c].val)break;
		for(int j=1;j<=c;j++){
			while(pos<=cnt&&v[pos]<e[j].val)pos++;
			if(pos>cnt)break;
			if(v[pos]==e[j].val)vis[i|e[j].u]=1;
		}
	}
	for(int i=1;i<=sta;i++)if(vis[i])ans++;
	cout<<ans;
	return 0;
}