Partition Problem

Given an array of numbers, if there is a subset that the sum of the items in the subset equals to exactly half of the sum of total array? This is a NP-Complete problem and similar to knapsack problem, it has a pseudo-polynomial DP solution for integers when the problem's scale is not too large.

Let denotes if there are a subset from the first elements which the sum of items in the subset equals to . If the sum of all items is even, then is the solution where n is the number of all items.

It is obviously that holds for all . As for , it is true if either is true or is true. where is the th element in the array.

Sample code:

class PartitionProblem {
    public static boolean can partition(int[] array) {
        int sum = 0;
        int n = array.length;
        for (int x: array) {
            sum += x;
        }
        if (sum % 2 != 0) return false;
        boolean[][] DP = new boolean[sum / 2 + 1][n + 1];

        for (int i = 0; i <= n; i++) DP[0][i] = true;

        for (int i = 0; i <= sum / 2; i++) {
            for (int j = 0; j <= n; j++) {
                if (i >= array[j]) DP[i][j] = DP[i][j - 1] || DP[i - array[j]][j - 1];
                else DP[i][j] = DP[i][j - 1];
            }
        }

        return DP[sum / 2][array.length];
    }
}