对于从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
| #include<bits/stdc++.h> 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; }
|