我们可以从分区的动态解决方案中获取子集吗?

时间:2018-01-13 10:17:15

标签: java arrays partitioning

我想打印一组的两个子集,这两个子集给出相同的总和,这基本上是分区问题。我正在使用partition problem的动态解决方案。问题是它只返回一个布尔答案(该集合是否可以分区)。如何从动态编程中使用的2d表中获取子集?

如何回溯用于获取元素的2D数组?

public class SubsetSum {
    public boolean partition(int arr[]) {
        int sum = 0;

        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }

        if (sum % 2 != 0) {
            return false;
        }

        sum = sum / 2;
        boolean[][] T = new boolean[arr.length + 1][sum + 1];

        for (int i = 0; i <= arr.length; i++) {
            T[i][0] = true;
        }

        for (int i = 1; i <= arr.length; i++) {
            for (int j = 1; j <= sum; j++) {
                if (j - arr[i - 1] >= 0) {
                    T[i][j] = T[i - 1][j - arr[i - 1]] || T[i - 1][j];
                } else {
                    T[i][j] = T[i-1][j];
                }
            }
        }

        return T[arr.length][sum];
    }

    public static void main(String args[]) {
        SubsetSum ss = new SubsetSum();
        int arr[] = {1, 3, 5, 5, 2, 1, 1, 6};
        System.out.println(ss.partition(arr));
    }
}

1 个答案:

答案 0 :(得分:0)

得到了答案。发布以防万一有人得到同样的问题。
如果partition方法返回true。 S1是Integer类型的ArrayList。它将存储子集中的一个元素,即Subset1。给定数组中的其余元素将是subset2的一部分。

if(T[input.length][total])
    {
        int i=input.length-1;
        int j=total;
        while(i!=0||j!=0)
        {
            if(T[i][j])
                i--;
            else
            {
                S1.add(input[i]);
                j-=input[i];
            }
        }
 }