View Code
1 /* 2 砝码称重 3 */ 4 5 6 #include7 #include 8 int f(int x,int y) 9 {10 if(x>y) return x-y;11 else return y-x;12 }13 int main()14 {15 16 17 int n;18 int p[10010];19 int sum[10010];20 int temp[10010];21 int a[105];22 int i,j,k,l;23 int totall;24 while(~scanf("%d",&n))25 {26 int count=0;27 l=0;28 memset(sum,0,sizeof(sum));29 memset(temp,0,sizeof(temp));30 totall=0;31 for(i=1;i<=n;i++)32 {33 scanf("%d",&a[i]);34 totall+=a[i];35 }36 sum[a[1]]=1;37 sum[0]=1;//注意不要漏这个初始化 38 for(i=2;i<=n;i++)39 {40 for(j=0;j<=totall;j++)41 {42 for(k=0;k<=a[i];k+=a[i])43 {44 temp[j+k]+=sum[j]; 45 temp[f(j,k)]+=sum[j];//砝码不一定放在一边 46 }47 }48 for(j=0;j<=totall;j++)49 {50 51 sum[j]=temp[j];52 temp[j]=0;53 54 }55 }56 57 58 for(i=1;i<=totall;i++)59 {60 if(sum[i]==0)61 {62 count++;63 p[l++]=i;64 }65 }66 if(count) 67 {68 printf("%d\n",count);69 printf("%d",p[0]);70 for(i=1;i