母函数的应用,和一般母函数不同的是:这个是求天枰根据所给的不同砝码,天枰不能称出的重量。我们求出天枰能称出的不同质量,就可以知道在砝码的质量总和中所不能称出的质量了。先用一般的母函数方法求出能砝码只放一边所能称出的质量,然后,逐渐用它一边能表示出的质量较大的逐个减去质量较小的砝码,就能求出所有能表示的质量。 求出所有能表达的质量,那么不能表达的质量也就迎刃而解了。
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n);
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
c1[0]=c1[a[0]]=1;
for(i=1;i<n;i++)
{
for(j=0;j<=sum;j++)
{
for(k=0;k+j<=sum&&k<=a[i];k+=a[i])
c2[k+j]+=c1[j];
}
for(j=0;j<=sum;j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
for(i=sum;i>=2;i--)
{
if(c1[i]==0)continue;
for(j=1;j<i;j++)
{
if(c1[j]==0)continue;
c2[i-j]=1;
}
}
k=0;
//for(i=0;i<=sum;i++)
//printf("%d:%d ",c1[i],c2[i]);
for(i=0;i<=sum;i++)
{
if(c1[i]==0&&c2[i]==0)b[k++]=i;
}
printf("%d/n",k);
for(i=0;i<k;i++)
printf(i<k-1?"%d ":"%d/n",b[i]);
}
return 0;
}