Maximum sum of pairs with specific difference

Given an array of integers and a number k. We can pair two number of array if difference between them is strictly less than k. The task is to find maximum possible sum of disjoint pairs. Sum of P pairs is sum of all 2P numbers of pairs.

Examples:

Input  : arr[] = {3, 5, 10, 15, 17, 12, 9}, K = 4
Output : 62
Then disjoint pairs with difference less than K are,
(3, 5), (10, 12), (15, 17)    
So maximum sum which we can get is 3 + 5 + 12 + 10 + 15 + 17 = 62
Note that an alternate way to form disjoint pairs is,
(3, 5), (9, 12), (15, 17), but this pairing produces lesser sum.

Input  : arr[] = {5, 15, 10, 300}, k = 12
Output : 25



First we sort the given array in increasing order. Once array is sorted, we traverse the array. For every element, we try to pair it with its previous element first. Why do we prefer previous element? Let arr[i] can be paired with arr[i-1] and arr[i-2] (i.e. arr[i] – arr[i-1] < K and arr[i]-arr[i-2] < K). Since the array is sorted, value of arr[i-1] would be more than arr[i-2]. Also, we need to pair with difference less than k, it means if arr[i-2] can be paired, then arr[i-1] can also be paired in a sorted array.
Now observing the above facts, we can formulate our dynamic programming solution as below,
Let dp[i] denotes the maximum disjoint pair sum we can achieve using first i elements of the array. Assume currently we are at i’th position, then there are two possibilities for us.

  Pair up i with (i-1)th element, i.e. 
      dp[i] = dp[i-2] + arr[i] + arr[i-1]
  Don't pair up, i.e. 
      dp[i] = dp[i-1] 

Above iteration takes O(N) time and sorting of array will take O(N log N) time so total time complexity of the solution will be O(N log N)

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find maximum pair sum whose
// difference is less than K
#include <bits/stdc++.h>
using namespace std;
  
// method to return maximum sum we can get by
// finding less than K difference pair
int maxSumPairWithDifferenceLessThanK(int arr[], int N, int K)
{
    // Sort input array in ascending order.
    sort(arr, arr+N);
  
    // dp[i] denotes the maximum disjoint pair sum
    // we can achieve using first i elements
    int dp[N];
  
    //  if no element then dp value will be 0
    dp[0] = 0;
  
    for (int i = 1; i < N; i++)
    {
        // first give previous value to dp[i] i.e.
        // no pairing with (i-1)th element
        dp[i] = dp[i-1];
  
        // if current and previous element can form a pair
        if (arr[i] - arr[i-1] < K)
        {
            // update dp[i] by choosing maximum between
            // pairing and not pairing
            if (i >= 2)
                dp[i] = max(dp[i], dp[i-2] + arr[i] + arr[i-1]);
            else
                dp[i] = max(dp[i], arr[i] + arr[i-1]);
        }
    }
  
    //  last index will have the result
    return dp[N - 1];
}
  
//  Driver code to test above methods
int main()
{
    int arr[] = {3, 5, 10, 15, 17, 12, 9};
    int N = sizeof(arr)/sizeof(int);
  
    int K = 4;
    cout << maxSumPairWithDifferenceLessThanK(arr, N, K);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find maximum pair sum whose
// difference is less than K
  
import java.io.*;
import java.util.*;
  
class GFG {
      
    // method to return maximum sum we can get by
    // finding less than K difference pair
    static int maxSumPairWithDifferenceLessThanK(int arr[],
                                               int N, int K)
    {
          
        // Sort input array in ascending order.
        Arrays.sort(arr);
      
        // dp[i] denotes the maximum disjoint pair sum
        // we can achieve using first i elements
        int dp[] = new int[N];
      
        // if no element then dp value will be 0
        dp[0] = 0;
      
        for (int i = 1; i < N; i++)
        {
            // first give previous value to dp[i] i.e.
            // no pairing with (i-1)th element
            dp[i] = dp[i-1];
      
            // if current and previous element can form a pair
            if (arr[i] - arr[i-1] < K)
            {
                  
                // update dp[i] by choosing maximum between
                // pairing and not pairing
                if (i >= 2)
                    dp[i] = Math.max(dp[i], dp[i-2] + arr[i] +
                                                    arr[i-1]);
                else
                    dp[i] = Math.max(dp[i], arr[i] + arr[i-1]);
            }
        }
      
        // last index will have the result
        return dp[N - 1];
    }
  
    // Driver code to test above methods
    public static void main (String[] args) {
          
        int arr[] = {3, 5, 10, 15, 17, 12, 9};
        int N = arr.length;
        int K = 4;
          
        System.out.println ( maxSumPairWithDifferenceLessThanK(
                                                    arr, N, K));
          
    }
}
  
//This code is contributed by vt_m.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find maximum pair 
# sum whose difference is less than K
  
# method to return maximum sum we can 
# get by get by finding less than K
# difference pair
def maxSumPairWithDifferenceLessThanK(arr, N, K):
  
    # Sort input array in ascending order.
    arr.sort()
  
    # dp[i] denotes the maximum disjoint
    # pair sum we can achieve using first
    # i elements
    dp = [0] * N
  
    # if no element then dp value will be 0
    dp[0] = 0
  
    for i in range(1, N):
      
        # first give previous value to
        # dp[i] i.e. no pairing with
        # (i-1)th element
        dp[i] = dp[i-1]
  
        # if current and previous element 
        # can form a pair
        if (arr[i] - arr[i-1] < K):
          
            # update dp[i] by choosing
            # maximum between pairing
            # and not pairing
            if (i >= 2):
                dp[i] = max(dp[i], dp[i-2] + arr[i] + arr[i-1]);
            else:
                dp[i] = max(dp[i], arr[i] + arr[i-1]);
          
    # last index will have the result
    return dp[N - 1]
  
# Driver code to test above methods
arr = [3, 5, 10, 15, 17, 12, 9]
N = len(arr)
K = 4
print(maxSumPairWithDifferenceLessThanK(arr, N, K))
  
# This code is contributed by Smitha Dinesh Semwal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find maximum pair sum whose
// difference is less than K
using System;
  
class GFG {
      
    // method to return maximum sum we can get by
    // finding less than K difference pair
    static int maxSumPairWithDifferenceLessThanK(int []arr,
                                              int N, int K)
    {
          
        // Sort input array in ascending order.
        Array.Sort(arr);
      
        // dp[i] denotes the maximum disjoint pair sum
        // we can achieve using first i elements
        int []dp = new int[N];
      
        // if no element then dp value will be 0
        dp[0] = 0;
      
        for (int i = 1; i < N; i++)
        {
            // first give previous value to dp[i] i.e.
            // no pairing with (i-1)th element
            dp[i] = dp[i-1];
      
            // if current and previous element can form 
            // a pair
            if (arr[i] - arr[i-1] < K)
            {
                  
                // update dp[i] by choosing maximum 
                // between pairing and not pairing
                if (i >= 2)
                    dp[i] = Math.Max(dp[i], dp[i-2] 
                                + arr[i] + arr[i-1]);
                else
                    dp[i] = Math.Max(dp[i], arr[i]
                                        + arr[i-1]);
            }
        }
      
        // last index will have the result
        return dp[N - 1];
    }
  
    // Driver code to test above methods
    public static void Main () {
          
        int []arr = {3, 5, 10, 15, 17, 12, 9};
        int N = arr.Length;
        int K = 4;
          
        Console.WriteLine( 
          maxSumPairWithDifferenceLessThanK(arr, N, K));
          
    }
}
  
// This code is contributed by anuj_67.

chevron_right



Output:

62

Time complexity : O(N Log N)
Auxiliary Space : O(N)

An optimised solution contributed by Amit Sane is given below,

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find maximum pair sum whose
// difference is less than K
#include <bits/stdc++.h>
using namespace std;
  
// Method to return maximum sum we can get by
// finding less than K difference pairs
int maxSumPairWithDifferenceLessThanK(int arr[], int N, int k)
{
    int maxSum = 0;
  
    // Sort elements to ensure every i and i-1 is closest
    // possible pair
    sort(arr, arr+N);
  
    // To get maximum possible sum, iterate from largest to
    // smallest, giving larger numbers priority over smaller
    // numbers.
    for (int i=N-1; i>0; --i)
    {
        // Case I: Diff of arr[i] and arr[i-1] is less then K,
        //         add to maxSum
        // Case II: Diff between arr[i] and arr[i-1] is not less
        //          then K, move to next i since with sorting we
        //          know, arr[i]-arr[i-1] < arr[i]-arr[i-2] and
        //          so on.
        if (arr[i]-arr[i-1] < k)
        {
            //Assuming only positive numbers.
            maxSum += arr[i];
            maxSum += arr[i-1];
  
            //When a match is found skip this pair
            --i;
        }
    }
  
    return maxSum;
}
  
// Driver code to test above methods
int main()
{
    int arr[] = {3, 5, 10, 15, 17, 12, 9};
    int N = sizeof(arr)/sizeof(int);
  
    int K = 4;
    cout << maxSumPairWithDifferenceLessThanK(arr, N, K);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find maximum pair sum whose
// difference is less than K
  
import java.io.*;
import java .util.*;
  
class GFG {
      
    // Method to return maximum sum we can get by
    // finding less than K difference pairs
    static int maxSumPairWithDifferenceLessThanK(int arr[], 
                                               int N, int k)
    {
        int maxSum = 0;
      
        // Sort elements to ensure every i and i-1 is closest
        // possible pair
        Arrays.sort(arr);
      
        // To get maximum possible sum, iterate from largest
        // to smallest, giving larger numbers priority over 
        // smaller numbers.
        for (int i = N-1; i > 0; --i)
        {
            // Case I: Diff of arr[i] and arr[i-1] is less then K,
            //     add to maxSum
            // Case II: Diff between arr[i] and arr[i-1] is not less
            //     then K, move to next i since with sorting we
            //     know, arr[i]-arr[i-1] < arr[i]-arr[i-2] and
            //     so on.
            if (arr[i] - arr[i-1] < k)
            {
                //Assuming only positive numbers.
                maxSum += arr[i];
                maxSum += arr[i-1];
      
                //When a match is found skip this pair
                --i;
            }
        }
      
        return maxSum;
    }
  
    // Driver code to test above methods
    public static void main (String[] args) {
          
        int arr[] = {3, 5, 10, 15, 17, 12, 9};
        int N = arr.length;
        int K = 4;
          
        System.out.println ( maxSumPairWithDifferenceLessThanK(
                                                    arr, N, K));
    }
}
  
//This code is contributed by vt_m.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find maximum pair sum whose
// difference is less than K
using System;
class GFG {
      
    // Method to return maximum sum we can get by
    // finding less than K difference pairs
    static int maxSumPairWithDifferenceLessThanK(int []arr, 
                                               int N, int k)
    {
        int maxSum = 0;
      
        // Sort elements to ensure
        // every i and i-1 is closest
        // possible pair
        Array.Sort(arr);
      
        // To get maximum possible sum, 
        // iterate from largest
        // to smallest, giving larger
        // numbers priority over 
        // smaller numbers.
        for (int i = N-1; i > 0; --i)
        {
              
            /* Case I: Diff of arr[i] and 
                       arr[i-1] is less then K,
                       add to maxSum 
               Case II: Diff between arr[i] and 
                        arr[i-1] is not less
                        then K, move to next i 
                        since with sorting we
                        know, arr[i]-arr[i-1] < 
                        arr[i]-arr[i-2] and
                        so on.*/
            if (arr[i] - arr[i-1] < k)
            {
                  
                // Assuming only positive numbers.
                maxSum += arr[i];
                maxSum += arr[i - 1];
      
                // When a match is found 
                // skip this pair
                --i;
            }
        }
      
        return maxSum;
    }
  
    // Driver Code
    public static void Main () 
    {
        int []arr = {3, 5, 10, 15, 17, 12, 9};
        int N = arr.Length;
        int K = 4;
          
        Console.Write( maxSumPairWithDifferenceLessThanK(arr, 
                                                         N, K));
    }
}
  
// This code is contributed by nitin mittal.

chevron_right



Output:

62

Time complexity : O(N Log N)
Auxiliary Space : O(1)

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : nitin mittal, vt_m