Maximum sum of pairs with specific difference - GeeksforGeeks

12 May, 2022
Given an array of integers and a number k. We can pair two numbers of the array if the difference between them is strictly less than k. The task is to find the maximum possible sum of disjoint pairs. Sum of P pairs is the sum of all 2P numbers of pairs.
Examples:
Input  : arr[] = {3, 5, 10, 15, 17, 12, 9}, K = 4Output : 62Explanation: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 = 62Note 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 = 12Output : 25
Approach: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++
Java
Python3
C#
PHP
Javascript
// 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 pairint 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 methodsint 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;}
// 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.
# 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 pairdef 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 methodsarr = [3, 5, 10, 15, 17, 12, 9]N = len(arr)K = 4print(maxSumPairWithDifferenceLessThanK(arr, N, K)) # This code is contributed by Smitha Dinesh Semwal
// C# program to find maximum pair sum whose// difference is less than Kusing 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.
<?php// Php program to find maximum pair sum whose// difference is less than K // method to return maximum sum we can get by// finding less than K difference pairfunction maxSumPairWithDifferenceLessThanK($arr, $N, $K){    // Sort input array in ascending order.    sort($arr) ;     // dp[i] denotes the maximum disjoint pair sum    // we can achieve using first i elements    $dp = array() ;     // if no element then dp value will be 0    $dp[0] = 0;     for ($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     $arr = array(3, 5, 10, 15, 17, 12, 9);    $N = sizeof($arr) ;     $K = 4;    echo maxSumPairWithDifferenceLessThanK($arr, $N, $K);      // This code is contributed by Ryuga?>
<script> // Javascript program to find maximum pair sum whose// difference is less than K     // method to return maximum sum we can get by    // finding less than K difference pair    function 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        let dp = [];              // if no element then dp value will be 0        dp[0] = 0;              for (let 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         let arr = [3, 5, 10, 15, 17, 12, 9];        let N = arr.length;        let K = 4;                  document.write( maxSumPairWithDifferenceLessThanK(                                                    arr, N, K));// This code is contributed by avijitmondal1998.</script>
62
Time complexity: O(N Log N) Auxiliary Space: O(N)
An optimised solution contributed by Amit Sane is given below, 
C++
Java
Python3
C#
PHP
Javascript
// 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 pairsint maxSumPair(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 than K,add to maxSum              // Case II: Diff between arr[i] and arr[i-1] is not        // less than K, move to next i since with        // sorting we know, arr[i]-arr[i-1] <        // rr[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 codeint main(){    int arr[] = { 3, 5, 10, 15, 17, 12, 9 };    int N = sizeof(arr) / sizeof(int);     int K = 4;    cout << maxSumPair(arr, N, K);    return 0;}
// 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            // than K, add to maxSum            // Case II: Diff between arr[i] and arr[i-1] is            // not less than 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(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.
# Python3 program to find maximum pair sum# whose difference is less than K # Method to return maximum sum we can# get by finding less than K difference# pairs  def maxSumPairWithDifferenceLessThanK(arr, N, k):     maxSum = 0     # Sort elements to ensure every i and    # i-1 is closest possible pair    arr.sort()     # To get maximum possible sum, iterate    # from largest to smallest, giving larger    # numbers priority over smaller numbers.    i = N - 1    while (i > 0):         # Case I: Diff of arr[i] and arr[i-1]        #     is less than K, add to maxSum        # Case II: Diff between arr[i] and        #     arr[i-1] is not less than 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 -= 1        i -= 1     return maxSum  # Driver Codearr = [3, 5, 10, 15, 17, 12, 9]N = len(arr) K = 4print(maxSumPairWithDifferenceLessThanK(arr, N, K)) # This code is contributed by mits
// C# program to find maximum pair sum whose// difference is less than Kusing 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 than K,                       add to maxSum               Case II: Diff between arr[i] and                        arr[i-1] is not less                        than 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.
<?php// PHP program to find maximum pair sum // whose difference is less than K // Method to return maximum sum we can // get by finding less than K difference// pairsfunction maxSumPairWithDifferenceLessThanK($arr, $N, $k){    $maxSum = 0;     // Sort elements to ensure every i and    // i-1 is closest possible pair    sort($arr);     // To get maximum possible sum, iterate    // from largest to smallest, giving larger    // numbers priority over smaller numbers.    for ($i = $N - 1; $i > 0; --$i)    {        // Case I: Diff of arr[i] and arr[i-1]        //           is less than K, add to maxSum        // Case II: Diff between arr[i] and        //            arr[i-1] is not less than 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$arr = array(3, 5, 10, 15, 17, 12, 9);$N = sizeof($arr); $K = 4;echo maxSumPairWithDifferenceLessThanK($arr, $N, $K); // This code is contributed// by Sach_Code   ?>
<script> // Javascript program to find// maximum pair sum whose// difference is less than K// Method to return maximum sum we can get by// finding less than K difference pairsfunction maxSumPairWithDifferenceLessThanK(arr, N, k){    var maxSum = 0;     // Sort elements to ensure every i and i-1 is    // closest possible pair    arr.sort((a,b)=>a-b);     // To get maximum possible sum,    // iterate from largest    // to smallest, giving larger    // numbers priority over    // smaller numbers.    for (i = N - 1; i > 0; --i)    {        // Case I: Diff of arr[i] and arr[i-1] is less        // than K, add to maxSum        // Case II: Diff between arr[i] and arr[i-1] is        // not less than 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 codevar arr = [ 3, 5, 10, 15, 17, 12, 9 ];var N = arr.length;var K = 4; document.write(maxSumPairWithDifferenceLessThanK(arr, N, K)); // This code is contributed by 29AjayKumar </script>
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 write.geeksforgeeks.org or mail your article to review-team@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. 
nitin mittal
vt_m
ankthon
Sach_Code
Mithun Kumar
ashsihpal7861
avijitmondal1998
29AjayKumar
surinderdawra388
Arrays
Dynamic Programming
Arrays
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Chocolate Distribution Problem
Count pairs with given sum
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
0-1 Knapsack Problem | DP-10
Program for Fibonacci numbers
Longest Common Subsequence | DP-4
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16