The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5463 Accepted Submission(s): 2214
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个砝码的重量,总质量为sum,问在1~sum中有多少个重量不能被称出来。
题解:母函数的应用,需要注意sum的值。
版本一:171ms
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 10002
int arr[102], store[maxn];
bool c1[maxn], c2[maxn];
int main()
{
int n, i, j, k, sum, count;
while(scanf("%d", &n) != EOF){
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for(i = sum = 0; i < n; ++i){
scanf("%d", arr + i);
sum += arr[i];
}
c1[0] = c1[arr[0]] = 1;
for(i = 1; i < n; ++i){
for(j = 0; j <= sum; ++j)
for(k = 0; k <= arr[i] && j + k <= sum; k += arr[i]){
c2[k + j] += c1[j];
c2[abs(k - j)] += c1[j];
}
for(k = 0; k <= sum; ++k){
c1[k] = c2[k]; c2[k] = 0;
}
}
for(count = 0, i = 1; i <= sum; ++i){
if(!c1[i]) store[count++] = i;
}
printf("%d\n", count);
if(count)
for(i = 0; i < count; ++i)
if(i != count - 1) printf("%d ", store[i]);
else printf("%d\n", store[i]);
}
return 0;
}
版本二:78ms
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 10002
int arr[102], store[maxn];
bool c1[maxn], c2[maxn];
int main()
{
int n, i, j, k, sum, count;
while(scanf("%d", &n) != EOF){
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for(i = sum = 0; i < n; ++i)
scanf("%d", arr + i);
c1[0] = c1[sum = arr[0]] = 1;
for(i = 1; i < n; ++i){
for(j = 0; j <= sum; ++j)
for(k = 0; k <= arr[i]; k += arr[i]){
c2[k + j] += c1[j];
c2[abs(k - j)] += c1[j];
}
sum += arr[i];
for(k = 0; k <= sum; ++k){
c1[k] = c2[k]; c2[k] = 0;
}
}
for(count = 0, i = 1; i <= sum; ++i){
if(!c1[i]) store[count++] = i;
}
printf("%d\n", count);
if(count)
for(i = 0; i < count; ++i)
if(i != count - 1) printf("%d ", store[i]);
else printf("%d\n", store[i]);
}
return 0;
}