usaco 2.2.2 subset

来源:互联网 发布:三菱马达选型软件 编辑:程序博客网 时间:2024/06/04 18:24

首先写了个暴力,结果没过。

/*ID: cm750621PROG: subsetLANG: 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: cm750621PROG: subsetLANG: 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];elseif(j==i)a[i][j]=a[i-1][j]+1;elseif(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;}


0 0