题目大意:
给出一个整数n,求共有多少种方法能将[1,n]分成两个元素和相等的部分。
思路:
简单0/1背包,思路见代码。
代码:
/* ID: lujunda1 LANG: C++ PROG: subset */ #include<iostream> #include<stdio.h> using namespace std; long long f[781]={1}; //将f[0]初始化为1,其余初始化为0。 int main() { freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); int n; scanf("%d",&n); int V=(1+n)*n/2; if(V%2) { printf("0\n"); return 0; } V/=2; //V表示容量。 for(int i=1;i<=n;i++) for(int v=V;v>=i;v--) f[v]+=f[v-i]; printf("%d\n",f[V]/2); //一种方法会出现两次。例如n=7时,{1、6、7}和{2、3、4、5}各出现一次。 }