// JAVA code to partition a set into two subsets // such that the difference of subset sums // is minimum public class MinimumPartitionProblem { // Function to find the minimum sum public static int findMinRec(int arr[], int i, int sumCalculated, int sumTotal) { // If we have reached last element. // Sum of one subset is sumCalculated, // sum of other subset is sumTotal- // sumCalculated. Return absolute // difference of two sums. if (i == 0) return Math.abs((sumTotal-sumCalculated) - sumCalculated); // For every item arr[i], we have two choices // (1) We do not include it first set // (2) We include it in first set // We return minimum of two choices return Math.min(findMinRec(arr, i - 1, sumCalculated + arr[i-1], sumTotal), findMinRec(arr, i-1, sumCalculated, sumTotal)); } // Returns minimum possible difference between // sums of two subsets public static int findMin(int arr[], int n) { // Compute total sum of elements int sumTotal = 0; for (int i = 0; i < n; i++) sumTotal += arr[i]; // Compute result using recursive function return findMinRec(arr, n, 0, sumTotal); } /* Driver program to test above function */ public static void main(String[] args) { int arr[] = {3, 1, 4, 2, 2, 1}; int n = arr.length; System.out.print("The minimum difference"+ " between two sets is " + findMin(arr, n)); } }