首先写了个暴力,结果没过。
/*
ID: cm750621
PROG: subset
LANG: C++
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
const int size=10010;
int i,j,k,m,n,ans;
void bfs(int sum,int num){
if(num>m)
return ;
if(sum==k){
ans++;
return ;
}
bfs(sum+num,num+1);
bfs(sum,num+1);
}
int main(){
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
scanf("%d",&m);
n=(1+m)*m/2;
if(n%2==1){
printf("0");
return 0;
}
k=n/2;
bfs(0,1);
printf("%d\n",ans);
return 0;
}
然后想了想,终于改对了
/*
ID: cm750621
PROG: subset
LANG: C++
*/
#include <cstdio>
#include <cstring>
long long a[40][40*(40+1)/2];
int main(){
freopen("subset.in", "r", stdin);
freopen("subset.out", "w", stdout);
int i,j,k,m,n;
a[1][1]=1;
scanf("%d",&n);
if(n*(n+1)%4!=0){
printf("0\n");
return 0;
}
for(i=2;i<=39;i++)
for(j=1;j<=i*(i+1)/2;j++){
if(i>n)
goto out;
if(j<i)
a[i][j]=a[i-1][j];
else
if(j==i)
a[i][j]=a[i-1][j]+1;
else
if(j > i)
a[i][j]=a[i-1][j]+a[i-1][j-i];
}
out:;
printf("%lld\n",a[n][n*(n+1)/2/2]/2);
return 0;
}