Here is one solution (dynamic programming) for partition an array of integers into two sub-arrays so that the difference of summaries (of sub-arrays) is minimal.
// partition an array of integers into two sub-arrays so that the difference of summaries (of sub-arrays) is minimal int balancePartitionTwoWays(int arr[], int n, int partition[2]) { if (n==2) { for (int i=0; i<2; i++) { partition[i]=arr[i]; } return abs(partition[0]-partition[1]); } // loop through the array to find out the sum and maximum int sum=0; int maximum = -1; for(int i=0; i<n; i++){ sum += arr[i]; if (arr[i]>maximum) maximum = arr[i]; } // allocate the matrix to remember bool memo[sum+maximum+1][2]; for (int j = 0; j < 2; j++) for (int i = 0; i <= sum+maximum; i++) memo[i][j] = false; memo[0][0] = true; // mark memo[i][k] to true if there is a subset // of array [0..i-1] with sum equal to i for (int j = 0; j < n; j++) { for (int i = 0; i <= sum+maximum; i++) { if (memo[i][j%2]) { memo[i][(j+1)%2] = true; memo[i+ arr[j]][(j+1)%2] = true; } } } int max_diff = INT_MAX; int part[2]; for (int i = 0; i <= sum+maximum; i++) { if (memo[i][n % 2]) { part[0]=i; part[1]=sum-i; int temp = abs(part[0]-part[1]) ; if (temp<max_diff) { max_diff = temp; partition[0] = part[0]; partition[1] = part[1]; } } } return max_diff; }
// partition an array of integers into three sub-arrays so that the difference of summaries (of sub-arrays) is minimal int balancePartitionThreeWays(int arr[], int n, int partition[3]) { if (n==3) { for (int i=0; i<3; i++) { partition[i]=arr[i]; } return abs(partition[0]-partition[1]) + abs(partition[1]-partition[2]) + + abs(partition[2]-partition[0]); } // loop through the array to find out the sum and maximum int sum=0; int maximum = -1; for(int i =0; i<n; i++){ sum += arr[i]; if (arr[i]>maximum) maximum = arr[i]; } // allocate the matrix to remember bool memo[sum+maximum+1][sum+maximum+1][2]; for (int k = 0; k < 2; k++) for (int i = 0; i <= sum+maximum; i++) for (int j = 0; j <= sum+maximum; j++) memo[i][j][k] = false; memo[0][0][0] = true; // mark memo[i][j][k] to true if there is a subset // of array [0..i-1] with sum equal to i for (int k = 0; k < n; k++) { for (int i = 0; i <= sum+maximum; i++) { for (int j = 0; j <= sum+maximum; j++) { if (memo[i][j][k%2]) { memo[i][j][(k+1)%2] = true; memo[i+ arr[k]][j][(k+1)%2] = true; memo[i][j+ arr[k]][(k+1)%2] = true; } } } } int max_diff = INT_MAX; int part[3]; for (int i = 0; i <= sum+maximum; i++) { for (int j = 0; j <= sum+maximum; j++) { if (memo[i][j][n % 2]) { part[0]=i; part[1]=j; part[2]=sum-i-j; //int temp = abs(part[0]-part[1]) + abs(part[1]-part[2]) + + abs(part[2]-part[0]); int temp = 0; for (int k=0; k<3; k++) { temp += abs(part[k%3]-part[(k+1)%3]); } if (temp<max_diff) { max_diff = temp; for (int k=0; k<3; k++) { partition[k]=part[k]; } } } } } return max_diff; }
Enjoy the journey.