比赛 国庆欢乐赛2 评测结果 TAWWWTTTTTTTTTTTTTTT
题目名称 毛一琛 最终得分 5
用户昵称 梦那边的美好ME 运行时间 47.992 s
代码语言 C++ 内存使用 3.51 MiB
提交时间 2025-10-04 11:22:27
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long


ll n,m[100],sum;
ll cnt,tot,ans[1000],to[1000],cot,as;
bitset<24> aa[10000],bb[10000];


void dfs2(ll sum,ll num,bitset<24> aaa){
    bitset<24> vis=aaa;
    if (sum==num/2){
        for (int i=1;i<=tot;i++){
            if (bb[i]==vis) return;
        }
        bb[++tot]=vis;
//        cout<<sum<<" "<<num<<" "<<vis<<endl;
        for (int i=1;i<=cot;i++){
            if (to[i]==num){
                ans[i]++;
                return;
            }
        }
        ans[++cot]++;
        to[cot]=num;
        return;
    }
    if (sum>num/2) return;
    for (int i=1;i<=n;i++){
        if (vis[i]==1){
            vis[i]=0;
            dfs2(sum+m[i],num,vis);
            vis[i]=1;
        }
    }
}

void dfs1(ll o,ll num,bitset<24> a){
    bitset<24> vis=a;
    if (o==n+1){
        if (num==0) return;
        if (num%2==1) return;
        for (int i=1;i<=cnt;i++){
            if (aa[i]==vis) return;
        }
        aa[++cnt]=vis;
        int bb=0;
        for (int i=1;i<=n;i++){
            if (vis[i]==1) bb++;
        }
        if (bb==1||bb==2) return;
        dfs2(0,num,vis);
        return;
    }
    vis[o]=0;
    dfs1(o+1,num-m[o],vis);
    vis[o]=1;
    dfs1(o+1,num,vis);
    return;
}


int main(){
//    freopen("in.in","r",stdin);
    freopen("subsets.in","r",stdin);
    freopen("subsets.out","w",stdout);
    scanf("%lld",&n);
    for (int i=1;i<=n;i++){
        scanf("%lld",&m[i]);
        sum+=m[i];
    }
    bitset<24> a;
    dfs1(1,sum,a);
    for (int i=1;i<=tot;i++){
        as+=ans[i]*(ans[i]-1);
    }
    printf("%lld",as/2);
    return 0;
}