The Balance 1709 (母函数 技巧(相加和相减)) 好题

来源:互联网 发布:炒贵金属软件 编辑:程序博客网 时间:2024/05/29 15:21

The Balance

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6802    Accepted Submission(s): 2796


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
31 2 439 2 1

Sample Output
024 5
 
//因为砝码可以放左边也可以放右边,(按左物右码规则),放左盘就取减号,放右盘就取加号,
//最终要将指数看作为正数,所以,所有所求得的系数都要取绝对值。
 
#include<stdio.h>#include<string.h>int a[10010],b[10010],c[110],d[10010];int main(){int n,i,j,k,sum;while(scanf("%d",&n)!=EOF){sum=0;for(i=1;i<=n;i++){scanf("%d",&c[i]);sum+=c[i];}for(i=0;i<=sum;i++){a[i]=0;b[i]=0;}for(i=0;i<=c[1];i+=c[1])a[i]=1;for(i=2;i<=n;i++){for(j=0;j<=sum;j++){for(k=0;k+j<=sum&&k<=c[i];k+=c[i]){if(k>=j)b[k-j]+=a[j];elseb[j-k]+=a[j];b[j+k]+=a[j];}}for(j=0;j<=sum;j++){a[j]=b[j];b[j]=0;}}int s=0;for(i=0;i<=sum;i++){if(a[i]==0){d[s++]=i;}}printf("%d\n",s);if(s){for(i=0;i<s-1;i++)printf("%d ",d[i]);printf("%d\n",d[s-1]);}}return 0;}

0 0