USACO2.22 Subset Sums(母函数)

哈,我的第一道母函数题目。

题意:一个由1~N 组成的集合,问将这个集合分成俩个子集,使得俩个子集的和相等的方法数。、

分析:分成俩个子集,子集的和相等,很明显,子集的和已经知道了。换种说法,就是求用1~N 这个数组合出和为(1+N)*N/4 方法数的一半。

这就用到 母函数的思想,求出函数(1+x)*(1+x^2)*(1+x^3)……(1+x^N)的展开式中,指数为 (1+N)*N/4 的项的系数。

/*
ID: nanke691
LANG: C++
TASK: subset
*/
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
long long num[800],num1[800];
int n;
void solve(int s)
{
	memset(num,0,sizeof(num));
	memset(num1,0,sizeof(num));
	num[1]=num1[1]=1;
	num[0]=num1[0]=1;
	for(int i=2;i<=n;i++)
	{
		for(int j=0;j<=i*(i+1)/2;j++)
			if(num[j]!=0)
			{
				num1[j+i]+=num[j];
			}
		for(int j=0;j<=i*(i+1)/2;j++)
			num[j]=num1[j];
	}
	cout<<num1[s]/2<<endl;
}
int main()
{
	freopen("subset.in","r",stdin);
	freopen("subset.out","w",stdout);
	cin>>n;
	int sum=(n+n*n)/2;
	if(sum%2!=0)
		cout<<0<<endl;
	else solve(sum/2);
}
原文地址:https://www.cnblogs.com/nanke/p/2228605.html