hdoj1709 The Balance (母函数)

来源:互联网 发布:老司机开车 知乎 编辑:程序博客网 时间:2024/04/30 09:56

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1709

The Balance

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>int main(){    int c[2][10102];    int a[101];    int n,i,j,k,s;  while(scanf("%d",&n)!=EOF)    {        for(i=0;i<n;i++)            scanf("%d",&a[i]);        int f=0;        s=0;        for(i=0;i<=200;i++)        {            c[0][i]=0;            c[1][i]=0;        }        c[0][0]=1;        c[0][a[0]]=1;        s+=a[0];        for(i=1;i<n;i++)        {            for(j=0;j<=s;j++)                for(k=-a[i];k<=a[i];k+=a[i])                    if(k+j>=0)c[!f][k+j]+=c[f][j];                    else c[!f][-(k+j)]+=c[f][j];                    s+=a[i];            for(k=0;k<=s+100;k++)                c[f][k]=0;            f=!f;        }        int b[10009]={0};        j=0;        for(i=0;i<=s;i++)        {            if(c[f][i]==0)b[j++]=i;        }        printf("%d\n",j);        if(j)        {            printf("%d",b[0]);            for(i=1;i<j;i++)                printf(" %d",b[i]);            printf("\n");        }    }    return 0;}



原创粉丝点击