题目大意
给出1到N的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。
题目解析
明显是个DP
设 f [ i ] [ j ] f[i][j] f[i][j] 是取了前 i i i 个数,总和为 j j j 的方案总数
转移方程:
f [ i ] [ j ] = f [ i ] [ j ] + f [ i − 1 ] [ j − i ] f[i][j] = f[i][j] + f[i-1][j-i] f[i][j]=f[i][j]+f[i−1][j−i]
代码
#include<bits/stdc++.h>
using namespace std;
long long n,sum,f[1005];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
sum+=i;
if(sum%2==0)
{
sum/=2;
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=sum;j>=i;j--)
f[j]+=f[j-i];
}
cout<<f[sum]/2;
}