Problem Description
Now you are asked to measure a dose of medicine with a balance and a number of weights. Certainly it is not always achievable. So you should find out the qualities which cannot be measured from the range [1,S]. S is the total quality of all the weights.
Input
The input consists of multiple test cases, and each case begins with a single positive integer N (1<=N<=100) on a line by itself indicating the number of weights you have. Followed by N integers Ai (1<=i<=N), indicating the quality of each weight where 1<=Ai<=100.
Output
For each input set, you should first print a line specifying the number of qualities which cannot be measured. Then print another line which consists all the irrealizable qualities if the number is not zero.
Sample Input


3
1 2 4  
3  
9 2 1


Sample Output


0
2  
4 5

解题思路:

用天平称重时,可以有两种方法。一种是砝码和物体分别放在两侧;

另一种是砝码和物体放在同一侧,另一侧再放砝码,此时和物体在同一侧的砝码相当于是负重量,这是本题的关键

首先,砝码重量可能相等,要统计各自的数量

然后再套用母函数

最后,统计不能称量的

程序代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define W 10005
using namespace std;
int b[W],c[W];
int main()
{
 int a[105],d[105];
 int N,i,t,n,j,len,r,p,k;
 while(scanf("%d",&N)!=EOF)
 {
  for(i=0;i<N;i++)
  scanf("%d",&a[i]);
  sort(a,a+N);
  d[0]=t=a[0];n=1;j=0;
  for(i=1;i<N;i++)
  {
   if(a[i]==t){n++;}
   else {d[j]=n;n=1;a[j++]=t;t=a[i];}
  }
  a[j]=t;
  d[j]=n;
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));
  for(i=0;i<=d[0]*a[0];i+=a[0])
   c[i]=1;len=d[0]*a[0];
  for(i=1;i<=j;i++)
  {
   for(p=0;p<=len;p++)
   for(k=0;k<=d[i]*a[i];k+=a[i])
   {
    b[p+k]+=c[p];
       if(k!=0&&p!=0)
        {r=fabs(p-k);
    b[r]+=c[p];}
   }
   len+=d[i]*a[i];
   for(k=0;k<=len;k++)
   {c[k]=b[k];b[k]=0;}
  }
  n=0;
  for(i=1,k=0;i<=len;i++)                       
  if(c[i]==0) b[k++]=i;
  if(k==0)printf("0\n");
  else {
   printf("%d\n",k);
  for(i=0;i<k;i++)
  { if(i!=0)printf(" ");
   printf("%d",b[i]);
  }
   printf("\n");
  }
 }
 return 0;

}
View Code