hdu 1709 The Balance(母函数)

import java.util.Scanner;

 

public class Main {
   
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
       
        int n;
        while(cin.hasNext()) {
            n = cin.nextInt();
            int[] weight = new int[n];
            int i, sum = 0;
            for(i = 0; i < n; i++) {
                weight[i] = cin.nextInt();
                sum += weight[i];
            }
            gfun(sum, n, weight);
        }
   
    }
   
    public static void gfun(final int n, final int cnt, final int[] num) {
        int i, j, k, l;
        int[] c1 = new int[n + 1];
        int[] c2 = new int[n + 1];
        c1[0] = 1;       
       
        for(i = 0; i < cnt; i++) {
            for(j = 0; j <= n; j++) {
                for(k = 0, l = 0; k + j <= n && l < 2; k += num[i]) {
//                    System.out.println("i=" + i + " j=" + j + " k=" + k);
                    c2[k + j] += c1[j];
                    c2[ Math.abs(k - j) ] += c1[j];
                    l++;
                }
            }
            for(j = 0; j <= n; j++) {
                c1[j] = c2[j];
                c2[j] = 0;
            }
        }
               
//        System.out.println("n=" + n);
//        for(i = 0; i <= n; i++) {
//            System.out.print(c1[i] + " ");
//        }
       
        int idx = 0;
        for(i = 1; i <= n; i++)
            if(c1[i] == 0) {
                c2[idx++] = i;
            }
        if(idx == 0) System.out.println("0");
        else {
            System.out.println(idx);
            for(i = 0; i < idx; i++) {
                if(i == 0) System.out.print(c2[i]);
                else System.out.print(" " + c2[i]);
            }
            System.out.println();
        }       
    }
   
}

posted @ 2010-10-14 00:31  菜到不得鸟  阅读(171)  评论(0)    收藏  举报