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;
}