参考博客
对于从1到N的连续整集合,划分为两个子集合,且保证每个集合的数字和是相等的。因而,划分之后每个子集全的数字应该为n(n+1)/2的一半,即n(n+1)/4由于两个子集中都是整数,所以n*(n+1)必为偶数,则可以设s=n*(n+1),并判断s%4 .则,s/=4是划分之后子集合的数字和;dyn[i]数组表示任意个数加起来等于i的组数。**
题解如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using namespace std;
int main()
{
int ans[100];
memset(ans,0,100);
int n,s;
cin>>n;
s=n*(n+1);
if(s%4!=0)
{
cout<<0<<endl;
return 0;
}
s/=4;
int i,j;
ans[0]=1;
for(i=1;i<=n;i++)
for(j=s;j>=i;j--)
ans[j]+=ans[j-i];
cout<<ans[s]/2<<endl;
return 1;
}