zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    AWR介绍使用
    hint使用
    部分索引类型介绍\索引重建否\索引压缩
    生成Oracle Statpack步骤
    自治事务
    append与nologging的使用
    聚簇表
    C语言杂谈——静态函数
    Qt之对话框设计——可扩展对话框
    C语言杂谈——指针篇
  • 原文地址:https://www.cnblogs.com/nanke/p/2228605.html
Copyright © 2011-2022 走看看