题目大意:将{1 2 3 4 .....n}分成两个集合,使得两个集合和相同,求方案数
思路:唔,这题会爆long long !!!! 就是做一个背包,然后由于3 1+2属于同一个,所以最后背包方案数除以2
1 /*{ 2 ID:a4298442 3 PROB:subset 4 LANG:C++ 5 } 6 */ 7 #include<iostream> 8 #include<fstream> 9 #define maxn 500 10 using namespace std; 11 ifstream fin("subset.in"); 12 ofstream fout("subset.out"); 13 //#define fin cin 14 //#define fout cout 15 long long dp[maxn]; 16 int main() 17 { 18 long long n,sum=0; 19 fin>>n; 20 for(int i=1;i<=n;i++)sum+=i; 21 if((sum&1)==1){fout<<0<<endl;return 0;} 22 long long v=sum>>1; 23 dp[0]=1; 24 for(int i=1;i<=n;i++) 25 { 26 for(int j=v;j>=i;j--) 27 { 28 dp[j]+=dp[j-i]; 29 } 30 } 31 fout<<(dp[v]>>1)<<endl; 32 return 0; 33 }