标签:
给你一组数 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;
}
标签:
原文地址:http://blog.csdn.net/u013451221/article/details/45078893