The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7060 Accepted Submission(s): 2912
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
题意: 有一个天平和n个砝码,给出这些砝码的质量ai,现在问你在[1,s](s表示砝码质量之和)间有哪些质量是秤不出来的,先输出个数,在输出确定的数。
题解:尴尬,这么简单的题都没读懂。 母函数变形啦,砝码是放在天平的左右两边的,对于每种质量我们可以ai+aj==weight,也可以
ai-aj==weight。 所以在进行合并乘法式是注意 c2[k+j]+=c1[j], 也有c2[abs(j-k)]+=c1[j]。
代码如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define maxn 10010
int c1[maxn],c2[maxn];
int a[110];
int main()
{
int n,i,j,k,cnt,sum,num;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum+=a[i];
}
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
c1[0]=c1[a[1]]=1;
num=a[1];
for(i=2;i<=n;++i)
{
for(j=0;j<=num;++j)
{
for(k=0;k<=a[i]&&k+j<=sum;k+=a[i])
{
c2[k+j]+=c1[j];
c2[abs(j-k)]+=c1[j];
}
}
num+=a[i];
for(j=0;j<=num;++j)
{
c1[j]=c2[j];
c2[j]=0;
}
}
int cnt=0;
for(i=0;i<=sum;++i)
{
if(!c1[i])
c2[cnt++]=i;
}
if(cnt==0)
printf("0\n");
else
{
printf("%d\n",cnt);
for(i=0;i<cnt;++i)
{
if(i==cnt-1)
printf("%d\n",c2[i]);
else
printf("%d ",c2[i]);
}
}
}
return 0;
}