您的位置:首页 > 编程语言 > C语言/C++

usaco 2.2.2 subset

2016-07-17 21:33 288 查看
首先写了个暴力,结果没过。

/*
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+1)/2/2]/2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 C++ usaco