记录编号 274020 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 [USACO Open12] 平衡奶牛子集 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.626 s
提交时间 2016-06-26 09:36:24 内存使用 77.64 MiB
显示代码纯文本
#include<stdio.h>
#define HASH 5000010
bool flag[1100000];
int ans,n,n1,n2,m1[15],m2[15];
int shu,first[HASH];
struct edge{int val,stat,nx;}o[HASH];
inline void add(int x,int y){
	int ha=(x%HASH+HASH)%HASH;
	for(int i=first[ha];i;i=o[i].nx)
	    if(o[i].val==x&&o[i].stat==y)
	        return;
	o[++shu].val=x,o[shu].stat=y,o[shu].nx=first[ha],first[ha]=shu;
}
inline void dfs1(int x,int now,int stat){
	if(x==n1){
		add(-now,stat);
		return;
	}
	dfs1(x+1,now-m1[x+1],stat|1<<x);
	dfs1(x+1,now,stat);
	dfs1(x+1,now+m1[x+1],stat|1<<x);
}
inline void dfs2(int x,int now,int stat){
	if(x==n2){
		int ha=(now%HASH+HASH)%HASH;
		for(int i=first[ha];i;i=o[i].nx)
		    if(o[i].val==now){
				if(!flag[stat<<n1|o[i].stat])
				    ++ans,flag[stat<<n1|o[i].stat]=1;
		    }
		return;
	}
	dfs2(x+1,now-m2[x+1],stat|1<<x);
	dfs2(x+1,now,stat);
	dfs2(x+1,now+m2[x+1],stat|1<<x);
}
int main(){
	freopen("subsets.in","r",stdin);
	freopen("subsets.out","w",stdout);
	scanf("%d",&n);
	n1=n>>1,n2=(n-1>>1)+1;
	for(int i=1;i<=n1;++i)scanf("%d",&m1[i]);
	for(int i=1;i<=n2;++i)scanf("%d",&m2[i]);
	dfs1(0,0,0);
	dfs2(0,0,0);
	printf("%d",ans-1);
	//while(1);
}