hdu 1709 母函数

    技术2022-05-18  15

    母函数的应用,和一般母函数不同的是:这个是求天枰根据所给的不同砝码,天枰不能称出的重量。我们求出天枰能称出的不同质量,就可以知道在砝码的质量总和中所不能称出的质量了。先用一般的母函数方法求出能砝码只放一边所能称出的质量,然后,逐渐用它一边能表示出的质量较大的逐个减去质量较小的砝码,就能求出所有能表示的质量。 求出所有能表达的质量,那么不能表达的质量也就迎刃而解了。

     

    #include<iostream> #include<algorithm> using namespace std; int c1[10100]; int c2[10100]; int b[10100]; int main() { int a[110]; int n,i,j,k,sum,t; 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; }


    最新回复(0)