比赛 |
国庆欢乐赛2 |
评测结果 |
AAAAAAAAATAATAAATAAA |
题目名称 |
毛一琛 |
最终得分 |
85 |
用户昵称 |
郑霁桓 |
运行时间 |
14.899 s |
代码语言 |
C++ |
内存使用 |
39.11 MiB |
提交时间 |
2025-10-04 12:09:23 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,a[25],p,t,sm,as;
map<int,int>mp;
map<int,bool>pm;
vector<int>v[1050000];
inline void dfs(int x,int s,int sx){
if(s+s>sm) return;
if(x==n+1){
if(!s) return;
p=mp[s];
if(p) v[p].push_back(sx);
else mp[s+a[x]]=++t,v[t].push_back(sx);
return;
}
dfs(x+1,s+a[x],sx+(1<<(x-1)));
dfs(x+1,s,sx);
return;
}
int main(){
freopen("subsets.in","r",stdin);
freopen("subsets.out","w",stdout);
cin>>n;
for(register int i=1;i<=n;i++) cin>>a[i],sm=sm+a[i];
dfs(1,0,0);
for(register int i=1;i<=t;i++) for(register int j=0;j<v[i].size();j++) for(register int k=j+1;k<v[i].size();k++)
if((v[i][j]&v[i][k])==0&&!pm[v[i][j]|v[i][k]]) as++,pm[v[i][j]|v[i][k]]=1;
cout<<as;
return 0;
}