Related Articles
Minimum partitions of maximum size 2 and sum limited by given value
• Last Updated : 07 Jan, 2019

Given an array arr[] of positive numbers, find minimum number of sets in array which satisfy following property,
1. A set can contain maximum two elements in it. The two elements need not to be contiguous.
2. Sum of elements of set should be less then or equal to given Key. It may be assumed that given key is greater than or equal to the largest array element.

Examples:

```Input: arr[] = [10, 20, 12], key = 25
Output: 2
We break into two parts {10, 12} and {2}

Input : arr[] = [3, 5, 3, 4], key=5
Output : 4
Explanation: 4 sets (3), (5), (3), (4)
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

The idea is to first sort the array, then follow two pointer approach. We begin two pointers from two corners of the sorted array. If their sum is smaller than or equal to given key, then we make set of them, else we consider the last element alone.

Below is the implementation of the above approach :

## C++

 `// C++ program to count minimum number of partitions``// of size 2 and sum smaller than or equal to given``// key.``#include ``#include ``using` `namespace` `std;`` ` `int` `minimumSets(``int` `arr[], ``int` `n, ``int` `key)``{``    ``int` `i, j;`` ` `    ``// sort the array``    ``sort(arr, arr + n);`` ` `    ``// if sum of ith smaller and jth larger element is``    ``// less than key, then pack both numbers in a set ``    ``// otherwise pack the jth larger number``    ``// alone in the set``    ``for` `(i = 0, j = n - 1; i <= j; ++i)``        ``if` `(arr[i] + arr[j] <= key)``            ``j--;`` ` `    ``// After ending of loop i will contain minimum``    ``// number of sets``    ``return` `i;``}`` ` `int` `main()``{``    ``int` `arr[] = { 3, 5, 3, 4 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);``    ``int` `key = 5;``    ``cout << minimumSets(arr, n, key);``    ``return` `0;``}`

## Java

 `// Java program to count minimum number of partitions``// of size 2 and sum smaller than or equal to given``// key.`` ` `import` `java.util.Arrays; ``class` `GFG {`` ` ` ` `static` `int` `minimumSets(``int` `arr[], ``int` `n, ``int` `key)``{``    ``int` `i, j;`` ` `    ``// sort the array``    ``Arrays.sort(arr);`` ` `    ``// if sum of ith smaller and jth larger element is``    ``// less than key, then pack both numbers in a set ``    ``// otherwise pack the jth larger number``    ``// alone in the set``    ``for` `(i = ``0``, j = n - ``1``; i <= j; ++i)``        ``if` `(arr[i] + arr[j] <= key)``            ``j--;`` ` `    ``// After ending of loop i will contain minimum``    ``// number of sets``    ``return` `i;``}`` ` ` ` ` ` `    ``public` `static` `void` `main (String[] args) {``    ``int` `[]arr = { ``3``, ``5``, ``3``, ``4` `};``    ``int` `n =arr.length;``    ``int` `key = ``5``;``    ``System.out.println( minimumSets(arr, n, key));``    ``}``}``// This code is contributed by chandan_jnu.`

## Python3

 `# Python 3 program to count minimum number ``# of partitions of size 2 and sum smaller ``# than or equal to given key.`` ` `def` `minimumSets(arr, n, key):``     ` `    ``# sort the array``    ``arr.sort(reverse ``=` `False``)`` ` `    ``# if sum of ith smaller and jth larger ``    ``# element is less than key, then pack ``    ``# both numbers in a set otherwise pack ``    ``# the jth larger number alone in the set``    ``j ``=` `n ``-` `1``    ``for` `i ``in` `range``(``0``, j ``+` `1``, ``1``):``        ``if` `(arr[i] ``+` `arr[j] <``=` `key):``            ``j ``-``=` `1`` ` `    ``# After ending of loop i will ``    ``# contain minimum number of sets``    ``return` `i ``+` `1`` ` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``arr ``=` `[``3``, ``5``, ``3``, ``4``]``    ``n ``=` `len``(arr)``    ``key ``=` `5``    ``print``(minimumSets(arr, n, key))`` ` `# This code is contributed by``# Shashank_Sharma`

## C#

 `// C# program to count minimum ``// number of partitions of size ``// 2 and sum smaller than or ``// equal to given key.``using` `System;``class` `GFG ``{`` ` `static` `int` `minimumSets(``int` `[]arr, ``                       ``int` `n, ``int` `key)``{``    ``int` `i, j;`` ` `    ``// sort the array``    ``Array.Sort(arr);`` ` `    ``// if sum of ith smaller and ``    ``// jth larger element is less ``    ``// than key, then pack both ``    ``// numbers in a set otherwise ``    ``// pack the jth larger number``    ``// alone in the set``    ``for` `(i = 0, j = n - 1; i <= j; ++i)``        ``if` `(arr[i] + arr[j] <= key)``            ``j--;`` ` `    ``// After ending of loop i ``    ``// will contain minimum``    ``// number of sets``    ``return` `i;``}`` ` `// Driver Code``public` `static` `void` `Main ()``{``    ``int` `[]arr = { 3, 5, 3, 4 };``    ``int` `n =arr.Length;``    ``int` `key = 5;``    ``Console.WriteLine(minimumSets(arr, n, key));``}``}`` ` `// This code is contributed``// by chandan_jnu.`

## PHP

 ``
Output:
```4
```

Time complexity: O(nlogn)

My Personal Notes arrow_drop_up