• Source
    1. import java.util.*;
    2.  
    3. class Ideone{
    4.  
    5. private static int INT_MAX = 100000;
    6.  
    7. public static void main(String[] args){
    8. int a[] = {1,7,4,11};
    9.  
    10. //Input: n integers range (0 to k) A1, A2....An
    11. //Goal: Partition into two subsets S1&S2, minimize |Sum(s1) - Sum(s2)|
    12. //
    13. //P[i,j]= 1 if some subset of {A1...Ai} has a sum of j, P[i-1, j] ==1 || P[i-1, j-Ai]==1
    14. // = 0 otherwise
    15. //
    16.  
    17. //Calculate sum of all integers of the array S
    18. int sum = 0;
    19. int n = a.length;
    20. for(int x : a){
    21. sum += x;
    22. }
    23. System.out.println("Total sum of the array => "+ sum);
    24.  
    25. boolean[][] partition = new boolean[n+1][sum+1];
    26.  
    27. //If sum is zero, answer is true
    28. for(int i=0; i<n+1; i++){
    29. partition[i][0] = true;
    30. }
    31.  
    32. //If elements to include are zero, we cannot make sum. so it is false
    33. for(int i=0; i<sum+1;i++){
    34. partition[0][i] = false;
    35. }
    36.  
    37. //File the subset table
    38. for(int i=1; i<n+1; i++){
    39. for(int j=1; j<sum+1; j++){
    40. if(partition[i-1][j] || (j>=a[i-1] && partition[i-1][j-a[i-1]])){
    41. partition[i][j] = true;
    42. }else{
    43. partition[i][j]= false;
    44. }
    45. }
    46. }
    47.  
    48. int min = INT_MAX;
    49. for(int i=0; i<n+1; i++){
    50. for(int j=0; j<sum+1; j++){
    51. if(partition[i][j] && min > sum-j){
    52. min = sum-j;
    53. }
    54. }
    55. }
    56.  
    57. System.out.println("Partition sum with min diff => "+ min);
    58. }
    59. }
    60.