# Minimum sum obtained by choosing N number from given N pairs

• Last Updated : 24 Nov, 2021

Given an array arr[] of N pairs of integers (A, B) where N is even, the task is to find the minimum sum of choosing N elements such that value A and B from all the pairs are chosen exactly (N/2) times.
Examples:

Input: N = 4, arr[][] = { {7, 20}, {300, 50}, {30, 200}, {30, 20} }
Output: 107
Explanation:
Choose value-A from 1st pair = 7.
Choose value-B from 2nd pair = 50.
Choose value-A from 3rd pair = 30.
Choose value-B from 4th pair = 20.
The minimum sum is 7 + 50 + 30 + 20 = 107.
Input: N = 4, arr[][] = { {10, 20}, {400, 50}, {30, 200}, {30, 20} }
Output: 110
Explanation:
Choose value-A from 1st pair = 10.
Choose value-B from 2nd pair = 50.
Choose value-A from 3rd pair = 30.
Choose value-B from 4th pair = 20.
The minimum sum is 10 + 50 + 30 + 20 = 110.

Approach: This problem can be solved using Greedy Approach. Below are the steps:

1. For each pair (A, B) in the given array, store the value of (B – A) with the corresponding index in temporary array(say temp[]). The value (B – A) actually defines how much cost is minimized if A is chosen over B for each element.
2. The objective is to minimize the total cost. Hence, sort the array temp[] in decreasing order.
3. Pick the first N/2 elements from the array temp[] by choosing A as first N/2 elements will have the maximum sum when A is chosen over B.
4. For remaining N/2 elements choose B as the sum of values can be minimized.

Below is the implementation of the above approach:

## CPP

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to choose the elements A``// and B such the sum of all elements``// is minimum``int` `minSum(``int` `arr[], ``int` `n)``{` `    ``// Create an array of pair to``    ``// store Savings and index``    ``pair<``int``, ``int``> temp[n];` `    ``// Traverse the given array of pairs``    ``for` `(``int` `i = 0; i < 2 * n; i++) {` `        ``// Sum minimized when A``        ``// is chosen over B for``        ``// i-th element.``        ``temp[i].first = arr[i]``                        ``- arr[i];` `        ``// Store index for the``        ``// future reference.``        ``temp[i].second = i;``    ``}` `    ``// Sort savings array in``    ``// non-increasing order.``    ``sort(temp, temp + 2 * n,``         ``greater >());` `    ``// Storing result``    ``int` `res = 0;` `    ``for` `(``int` `i = 0; i < 2 * n; i++) {` `        ``// First n elements choose``        ``// A and rest choose B``        ``if` `(i < n)``            ``res += arr[temp[i].second];``        ``else``            ``res += arr[temp[i].second];``    ``}` `    ``// Return the final Sum``    ``return` `res;``}` `// Driver Code``int` `main()``{``    ``// Given array of pairs``    ``int` `arr = { { 7, 20 },``                      ``{ 300, 50 },``                      ``{ 30, 200 },``                      ``{ 30, 20 } };` `    ``// Function Call``    ``cout << minSum(arr, 2);``}`

## Python3

 `# Python3 program for the above approach` `# Function to choose the elements A``# and B such the sum of all elements``# is minimum``def` `minSum(arr, n):` `    ``# Create an array of pair to``    ``# store Savings and index``    ``temp ``=` `[``None``]``*``(``2``*``n)` `    ``# Traverse the given array of pairs``    ``for` `i ``in` `range``(``2` `*` `n):` `        ``# Sum minimized when A``        ``# is chosen over B for``        ``# i-th element.``        ``temp[i] ``=` `(arr[i][``1``] ``-` `arr[i][``0``], i)` `    ``# Sort savings array in``    ``# non-increasing order.``    ``temp.sort(reverse``=``True``)` `    ``# Storing result``    ``res ``=` `0` `    ``for` `i ``in` `range``(``2` `*` `n):` `        ``# First n elements choose``        ``# A and rest choose B``        ``if` `(i < n):``            ``res ``+``=` `arr[temp[i][``1``]][``0``]``        ``else``:``            ``res ``+``=` `arr[temp[i][``1``]][``1``]` `    ``# Return the final Sum``    ``return` `res`  `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``# Given array of pairs``    ``arr ``=` `[[``7``, ``20``],``           ``[``300``, ``50``],``           ``[``30``, ``200``],``           ``[``30``, ``20``]]` `    ``# Function Call``    ``print``(minSum(arr, ``2``))`

Output:

`107`

Time Complexity: O(N*log(N))
Auxiliary Space Complexity: O(N)

My Personal Notes arrow_drop_up