hdu 1709 The Balance(母函数)

题意:http://acm.hdu.edu.cn/showproblem.php?pid=1709

组合问题,应用母函数,需要注意的是每种不同的砝码只有一个,可以相加,可以相减。所以,s(x)=(1+x^a)(1+x^b)(1+x^c)---(1+x^z)。

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[105];
int c1[10005],c2[10005],zero[10005];
int main()
{
    //freopen("cin.txt","r",stdin);
    int n,i,j,num,sum;
    while(cin>>n){
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        sum=0;
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        c1[0]=1;  c1[a[0]]=1;
        for(i=1;i<n;i++){
            for(j=0;j<=sum;j++)c2[j]+=c1[j];
            for(j=0;j<=sum;j++){
                c2[a[i]+j]+=c1[j];
                if(j>a[i])c2[j-a[i]]+=c1[j];
                if(j<a[i])c2[a[i]-j]+=c1[j];
            }
            for(j=0;j<=sum;j++){
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        int res=0;
        for(i=1;i<=sum;i++){
            if(c1[i]==0)zero[res++]=i;
        }
        printf("%d\n",res);
        if(res){
            for(i=0;i<res-1;i++)printf("%d ",zero[i]);
            printf("%d\n",zero[res-1]);
        }
    }
    return 0;
}



你可能感兴趣的:(HDU)