开始的时候写的一个超时了的代码,用广搜,搜索确实厉害,但是在DP面前瞬间就萎了,唉...
/*
ID: fairyroad
TASK:subset
LANG:C++
*/
// 超时代码,思路是BFS
#include<fstream>
#ifdef debug
#include<iostream>
#endif
#include<deque>
using namespace std;
ifstream fin("subset.in");
ofstream fout("subset.out");
struct node
{
int sum, next;
node() : sum(0), next(0) {}
node(int s, int n) : sum(s), next(n) {}
};
int n;
deque<node> Q;
#ifdef debug
void print()
{
for(size_t i = 0; i < Q.size(); ++i)
cout<<"["<<Q[i].sum<<", "<<Q[i].next<<"] ";
cout<<"\n";
}
#endif
int main()
{
fin>>n;
int sum = n*(n+1)/2;
if(sum & 0x1u)
{
fout<<0<<endl;;
return 0;
}
sum >>= 1;
int maxdepth = n>>1, depth = 0, res = 0;
node val;
Q.push_back(node(0, 1));
while(depth <= maxdepth)
{
#ifdef debug
print();
#endif
int len = Q.size();
for(int i = 0; i < len; ++i)
{
val = Q.front();
if(val.sum == sum)
++res;
else
for(int j = val.next; j <= n; ++j)
{
if(val.sum+j > sum) break;
Q.push_back(node(val.sum+j, j+1));
}
Q.pop_front();
}
++depth;
}
fout<<res<<endl;
return 0;
}
/*
ID: fairyroad
TASK:subset
LANG:C++
*/
/*
* 动态规划: dp[i][j]=dp[i-1][j-i]+dp[i-1][j];
* dp[i][j]表示前i个数字构成j的方案数
* 编码当然不必这么死板,比如i 已经包含在循环的控制变量里面了
*/
#include<fstream>
using namespace std;
ifstream fin("subset.in");
ofstream fout("subset.out");
int n;
size_t dp[800];
int main()
{
fin>>n;
int sum = n*(n+1)/2;
if(sum & 0x1u)
{
fout<<0<<endl;;
return 0;
}
sum >>= 1;
dp[0] = 1;
for(int i = 1; i <= n; ++i)
for(int j = sum; j >= i; --j)
dp[j] += dp[j-i];
fout<<dp[sum]/2<<endl;
return 0;
}