The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3249 Accepted Submission(s): 1294
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
Source
Recommend
lcy
题目类型:普通型母函数
题目描述:给你n个砝码,一个天平,砝码总共重s.问在[1,s]的这个区间里,哪个重量称不出来。
题目分析:因为天平左右都能放砝码,所以可以这样。往左面放认为是正,往右面放认为是负。这样每个砝码的母函数相当于 x^-v[i] 1 x ^ v[i].
代码如下:
#include <stdio.h>
#include <memory.h>
#define N 10001
#define M 101
int r[N];
int fr[N];
int t[N];
int ft[N];
int v[M];
int n,s;
int jd(int x){
if(x < 0){
x = -x;
}
return x;
}
void init(){
int i,j,k;
memset(r,0,sizeof(r));
memset(fr,0,sizeof(fr));
memset(t,0,sizeof(t));
memset(ft,0,sizeof(ft));
r[0] = 1,r[v[0]] = 1,fr[v[0]] = 1;
for( k = 1; k < n; k++){
for( i = 0; i <= s; i++){
for( j = -v[k]; j <= v[k]; j += v[k]) {
if( r[i] != 0) {
if(i+j < 0){
ft[jd(i+j)] = 1;
} else {
t[i+j] = 1;
}
}
}
}
for( i = 1; i <= s; i++){
for( j = -v[k]; j <= v[k]; j += v[k]) {
if( fr[i] != 0){
if( -i + j < 0){
ft[jd(-i+j)] = 1;
} else {
t[-i+j] = 1;
}
}
}
}
for( i = 0; i <= s ;i++){
r[i] = t[i];
t[i] = 0;
fr[i] = ft[i];
ft[i] = 0;
}
}
}
void result(){
int i,sum = 0;
for( i = 0; i <= s; i++){
if(r[i] == 0){
sum++;
}
}
printf("%d\n",sum);
if( sum != 0) {
int flag = 0;
for( i = 0; i <= s; i++){
if(r[i] == 0) {
if( flag == 0){
flag = 1;
} else {
printf(" ");
}
printf("%d",i);
}
}
printf("\n");
}
}
int main()
{
while(scanf("%d",&n) != EOF){
s = 0;
int i;
for( i = 0; i < n; i++){
scanf("%d",v+i);
s += v[i];
}
init();
result();
}
return 0;
}