Balanced subset sum problem is described as to divide array into two subsets such that difference of sum of two sub sets is minimum, Best case will be when sum of two subsets are equal.
Note: - We can not leave elements from the original set .
Now i need to get the sum of set 1 and set 2 for the minimum difference partitioning, I have already found the sum of sets using a O(sum*sum*n) solution , but for the purpose of what I am doing i need something with a better complexity. How can this be solved in less time than O(sum*sum*n)?
My O(N^3) approach is as under: Note : -s1,s2,s3 are static variables,sum being the sum of array.
static int partition(int sum1, int sum2, ArrayList < Integer > arr, int i) { if (i == arr.size()) { if (Math.abs(sum1 - sum2) < s3) { s1 = sum1; s2 = sum2; s3 = Math.abs(sum1 - sum2); } return Math.abs(sum1 - sum2); } if (dp[(sum1 < 0) ? 2 * sum - sum1 : sum1][(sum1 < 0) ? 2 * sum - sum1 : sum1][i] != 0) return dp[(sum1 < 0) ? 2 * sum - sum1 : sum1][(sum1 < 0) ? 2 * sum - sum1 : sum1][i] > 0 ? dp[(sum1 < 0) ? 2 * sum - sum1 : sum1][(sum1 < 0) ? 2 * sum - sum1 : sum1][i] - 1 : dp[(sum1 < 0) ? 2 * sum - sum1 : sum1][(sum1 < 0) ? 2 * sum - sum1 : sum1][i]; int c1 = partition(sum1 + arr.get(i), sum2, arr, i + 1); int c2 = partition(sum1, sum2 + arr.get(i), arr, i + 1); if (Math.abs(c1) < Math.abs(c2)) { dp[(sum1 < 0) ? 2 * sum - sum1 : sum1][(sum1 < 0) ? 2 * sum - sum1 : sum1][i] = c1 >= 0 ? c1 + 1 : c1; return c1; } else { dp[(sum1 < 0) ? 2* sum - sum1 : sum1][(sum1 < 0) ? 2 * sum - sum1 : sum1][i] = c2 >= 0 ? c2 + 1 : c2; return c2; } }
arrbe?