题目描述
对于从 1 1 1到 N ( 1 < = N < = 39 ) N (1 <= N <= 39) N(1<=N<=39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。
题目解析
D P DP DP,设 f [ i ] [ j ] f[i][j] f[i][j]表示已经做完 1 1 1~ i i i,和为 j j j的方案数
f [ i ] [ j ] = f [ i ] [ j ] + f [ i − 1 ] [ j − i ] — — ( j > = i ) f[i][j]=f[i][j]+f[i−1][j−i]——(j>=i) f[i][j]=f[i][j]+f[i−1][j−i]——(j>=i)
再判断一下当 1 1 1到 N N N的和不为偶数的情况即可。记得要用 l o n g long long l o n g long long
代码
#include<cstdio>
using namespace std;
long long n,f[1005],t;
int main()
{
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++) t+=i;
if(t%2!=0)
{
printf("0");
return 0;
}
t/=2;
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=t;j>=i;j--)
f[j]+=f[j-i];
printf("%lld",f[t]/2);
}