记录编号 |
606899 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
4179.毛一琛 |
最终得分 |
100 |
用户昵称 |
梦那边的美好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;
}