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;
}
/*
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++实现JNI接口需要注意的事项
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解