The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7248 Accepted Submission(s): 2990
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
Sample Output
Source
HDU 2007-Spring Programming Contest
个人理解题意:
给你n个砝码让你在天平上看能让这些砝码能测出小于等 于砝码的总质量,把不能测出的质量输出来。
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<stdio.h>
#include <cstring>
#include<string>
#include<cmath>
#include<algorithm>
int c1[10000],c2[10000];
int main()
{
int T;
while(~scanf("%d",&T))
{
int a[10000];
int i,sum=0,j,k,w=0;
for(i=0;i<T;i++)
{
scanf("%d",&a[i]);
sum+=a[i];//计算出砝码的的总质量
}
for(i=T;i<2*T;i++)
{
a[i]=-a[i-T];//因为砝码可以放两边
}
memset(c1,0,sizeof(c1));//母函数模板
memset(c2,0,sizeof(c2));
c1[0]=1;
c1[a[0]]=1;
for(i=1;i<2*T;i++)
{
for(k=0;k<=sum;k++)
{
if(c1[k]==1)//等于1说明存在。
{
c2[k]=1;
if(k+a[i]>=0)
c2[k+a[i]]=1;
}
}
for(j=0;j<=sum;j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
int q=0;
for(i=1;i<=sum;i++)
{
if(c1[i]==0)
{
q++;
}
}
if(q==0)
printf("0\n");
else
{
printf("%d\n",q);
for(i=1;i<=sum;i++)
{
if(c1[i]==0&&w==0)//w控制格式的
{
printf("%d",i);
w=1;
}
else if(c1[i]==0&&w==1)
{
printf(" %d",i);
}
}
printf("\n");
}
}
return 0;
}