给你一组数 1 ~ N,问你能有几种分法,把他们分成2组,2组的和相等。
如果 sum(1 ~ n) 为奇数,直接输出0,负责的话 主要找到 和为 sum / 2的组数 再除以2就是结果
因为N 最大为39 如果单向搜索肯定超时,改成双向的就行了
/* ID: 18906421 LANG: C++ PROG: subset */ #include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 40; const int maxd = 1500; LL num[maxn],sum = 0,cnt = 0; int n; LL vis[maxd] = {0}; void dfs1(int pos,int num,int s){ if(s <= sum) vis[s]++; else return; for(int i = pos; i <= num; i++) dfs1(i + 1,num,s + i); return; } void dfs2(int pos,int num,int s){ if(s <= sum){ int e = sum - s; if(vis[e]) cnt += vis[e]; } else return; for(int i = pos; i <= num; i++) dfs2(i + 1,num,s + i); return; } int main(){ freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); cin >> n; for(int i = 1; i <= n; i++){ num[i] = i; sum += i; } if(sum & 1) cout << 0 << endl; else{ sum /= 2; dfs1(1,n / 2,0); dfs2(n / 2 + 1,n,0); cout << cnt / 2 << endl; } return 0; }
时间: 2024-11-08 00:33:58