# Smallest subset with sum greater than all other elements

Given an array of non-negative integers. Our task is to find minimum number of elements such that their sum should be greater than the sum of rest of the elements of the array.

Examples :

```Input : arr[] = {3, 1, 7, 1}
Output : 1
Smallest subset is {7}. Sum of
this subset is greater than all
other elements {3, 1, 1}

Input : arr[] = {2, 1, 2}
Output : 2
In this example one element is not
enough. We can pick elements with
values 1, 2 or 2, 2. In any case,
the minimum count is 2.
```

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

The Brute force approach is to find the sum of all the possible subsets and then compare sum with the sum of remaining elements.

The Efficient Approach is to take the largest elements. We sort values in descending order, then take elements from the largest, until we get strictly more than half of total sum of the given array.

 `// CPP program to find minimum number of ` `// elements such that their sum is greater ` `// than sum of remaining elements of the array. ` `#include ` `#include ` `using` `namespace` `std; ` ` `  `// function to find minimum elements needed. ` `int` `minElements(``int` `arr[], ``int` `n) ` `{ ` `    ``// calculating HALF of array sum  ` `    ``int` `halfSum = 0; ` `    ``for` `(``int` `i = 0; i < n; i++)  ` `        ``halfSum = halfSum + arr[i];     ` `    ``halfSum = halfSum / 2; ` ` `  `    ``// sort the array in descending order. ` `    ``sort(arr, arr + n, greater<``int``>()); ` ` `  `    ``int` `res = 0, curr_sum = 0; ` `    ``for` `(``int` `i = 0; i < n; i++) { ` ` `  `        ``curr_sum += arr[i];  ` `        ``res++; ` ` `  `        ``// current sum greater than sum ` `        ``if` `(curr_sum > halfSum)          ` `            ``return` `res; ` `    ``} ` `    ``return` `res; ` `} ` ` `  `// Driver function ` `int` `main() ` `{ ` `    ``int` `arr[] = {3, 1, 7, 1}; ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr); ` `    ``cout << minElements(arr, n) << endl;  ` `    ``return` `0; ` `} `

 `// Java code to find minimum number of elements ` `// such that their sum is greater than sum of ` `// remaining elements of the array. ` `import` `java.io.*; ` `import` `java.util.*; ` ` `  `class` `GFG { ` `     `  `    ``// Function to find minimum elements needed ` `    ``static` `int` `minElements(``int` `arr[], ``int` `n) ` `    ``{ ` `        ``// Calculating HALF of array sum  ` `        ``int` `halfSum = ``0``; ` `        ``for` `(``int` `i = ``0``; i < n; i++)  ` `            ``halfSum = halfSum + arr[i];  ` `        ``halfSum = halfSum / ``2``; ` `     `  `     `  `        ``// Sort the array in ascending order and  ` `        ``// start traversing array from the ascending ` `        ``// sort in descending order. ` `        ``Arrays.sort(arr); ` `         `  `        ``int` `res = ``0``, curr_sum = ``0``; ` `        ``for` `(``int` `i = n-``1``; i >= ``0``; i--) { ` `     `  `            ``curr_sum += arr[i];  ` `            ``res++; ` `     `  `            ``// Current sum greater than sum ` `            ``if` `(curr_sum > halfSum)          ` `                ``return` `res; ` `        ``} ` `        ``return` `res; ` `    ``} ` `     `  `    ``// Driver Code ` `    ``public` `static` `void` `main (String[] args) { ` `        ``int` `arr[] = {``3``, ``1``, ``7``, ``1``}; ` `        ``int` `n = arr.length; ` `        ``System.out.println(minElements(arr, n)); ` `    ``} ` `    ``} ` `     `  `// This code is contributed by Gitanjali `

 `# Python3 code to find minimum number of ` `# elements such that their sum is greater ` `# than sum of remaining elements of the array. ` ` `  `# function to find minimum elements needed. ` `def` `minElements(arr , n): ` ` `  `    ``# calculating HALF of array sum ` `    ``halfSum ``=` `0` `    ``for` `i ``in` `range``(n): ` `        ``halfSum ``=` `halfSum ``+` `arr[i] ` `     `  `    ``halfSum ``=` `int``(halfSum ``/` `2``) ` `     `  `    ``# sort the array in descending order. ` `    ``arr.sort(reverse ``=` `True``) ` `     `  `    ``res ``=` `0` `    ``curr_sum ``=` `0` `    ``for` `i ``in` `range``(n): ` `         `  `        ``curr_sum ``+``=` `arr[i] ` `        ``res ``+``=` `1` ` `  `        ``# current sum greater than sum ` `        ``if` `curr_sum > halfSum: ` `            ``return` `res ` `     `  `    ``return` `res ` `     `  `# driver code ` `arr ``=` `[``3``, ``1``, ``7``, ``1``] ` `n ``=` `len``(arr) ` `print``(minElements(arr, n) ) ` ` `  `# This code is contributed by "Sharad_Bhardwaj". `

 `// C# code to find minimum number of elements ` `// such that their sum is greater than sum of ` `// remaining elements of the array. ` `using` `System; ` ` `  `class` `GFG { ` `     `  `    ``// Function to find minimum elements needed ` `    ``static` `int` `minElements(``int` `[]arr, ``int` `n) ` `    ``{ ` `         `  `        ``// Calculating HALF of array sum  ` `        ``int` `halfSum = 0; ` `         `  `        ``for` `(``int` `i = 0; i < n; i++)  ` `            ``halfSum = halfSum + arr[i];  ` `             `  `        ``halfSum = halfSum / 2; ` `     `  `        ``// Sort the array in ascending order and  ` `        ``// start traversing array from the ascending ` `        ``// sort in descending order. ` `        ``Array.Sort(arr); ` `         `  `        ``int` `res = 0, curr_sum = 0; ` `        ``for` `(``int` `i = n-1; i >= 0; i--) { ` `     `  `            ``curr_sum += arr[i];  ` `            ``res++; ` `     `  `            ``// Current sum greater than sum ` `            ``if` `(curr_sum > halfSum)      ` `                ``return` `res; ` `        ``} ` `         `  `        ``return` `res; ` `    ``} ` `     `  `    ``// Driver Code ` `    ``public` `static` `void` `Main () ` `    ``{ ` `        ``int` `[]arr = {3, 1, 7, 1}; ` `        ``int` `n = arr.Length; ` `         `  `        ``Console.WriteLine(minElements(arr, n)); ` `    ``} ` `} ` `     `  `// This code is contributed by vt_m. `

 ` ``\$halfSum``)          ` `            ``return` `\$res``; ` `    ``} ` `    ``return` `\$res``; ` `} ` ` `  `// Driver Code ` `\$arr` `= ``array``(3, 1, 7, 1); ` `\$n` `= sizeof(``\$arr``); ` `echo` `minElements(``\$arr``, ``\$n``); ` `     `  `// This code is contributed by ihritik ` `?> `

Output:
```1
```

Time Complexity :
O(n Log n)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

Intern at GeeksforGeeks

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : ihritik, nidhi_biet

Article Tags :
Practice Tags :