晓萌希望将1到 N 的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等。例如,对于 N =3,对应的集合{1,2,3} 能被划分成{3} 和{1,2} 两个子集合。
这两个子集合中元素分别的和是相等的。
对于 N =3,我们只有一种划分方法,而对于 N =7时,我们将有 4种划分的方案,
输入格式
输入包括一行,仅一个整数,表示 N 的值(1 ≤ N < 39)。
输出格式
输出包括一行,仅一个整数,晓萌可以划分对应 N 的集合的方案的个数。当没法划分时,输出 0
#include<bits/stdc++.h>
using namespace std;
long long dp[40][800] = {0};
int main(){
int cnt = 0, n ,aim = 0;
freopen("division.in", "r", stdin);
freopen("division.out", "w", stdout);
cin >> n;
for(int i = 1; i <= n; i++){
aim += i;
}
if(aim % 2)
cout << "0" << endl;
else{
for(int i = 1;i <= n;i++){
dp[i][aim / 2] = 1;
}
for(int i = aim / 2; i >= 0; i--){
for(int j = 0; j <= n; j++){
for(int k = j + 1; k <= n; k++){
if(i >= k)
dp[j][i - k] += dp[k][i];
}
}
}
cout << dp[0][0] / 2 << endl;
}
return 0;
}