dp经典类型之一
sum = (N + 1) * N / 2;
sum为奇数pass;sum为偶数,求和为sum / 2的方案数(貌似曾经见过类似 / 2类型的dp,思路巧妙)
注意最后结果还需要除以2,因为对称嘛
附上代码(倒数第二个测评点WA了几次...后来改long long过了......觉得N <= 40方案数不至于那么大...以后组合问题尽可能开大一些)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2000;ll dp[maxn];
int N;int main()
{cin >> N;dp[0] = 1;int sum = (N + 1) * N / 2;if(sum & 1){cout << "0" << endl;return 0;}for(int i = 1; i <= N; i++){for(int j = sum / 2; j >= i; j--){if(dp[j - i]) dp[j] += dp[j - i];}}cout << dp[sum / 2] / 2 << endl;return 0;
}