GeeksforGeeks App
Open App
Browser
Continue

# Smallest subset with sum greater than all other elements

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

Example:

Input: arr[] = [ 3 , 1 , 7, 1 ]
Output: 1
Explanation: Smallest subset is {7}. Sum of this subset is greater than the sum of all other elements left after removing subset {7} from the array

Input:  arr[] = [ 2 , 1 , 2 ]
Output: 2
Explanation: Smallest subset is {2 , 1}. Sum of this subset is greater than the sum of all other elements left after removing subset {2 , 1} from the array

## Smallest subset with sum greater than all other elements using Sorting

The approach is to take the largest elements from the array , in that way we can decrease the size of the subset that has sum greater than the sum of rest of the elements of the array , so we sort the array in descending order, then take the largest elements, until we get strictly more than half of total sum of the given array.

Follow the steps mentioned below to implement the idea:

• Create a variable halfSum to store half of the overall sum of the array arr[].
• Sort the array in descending order.
• Create a variable curr_sum and increase the value of curr_sum by arr[i] while traversing the array from index 0 till the value of curr_sum is less than halfSum
• When curr_sum is greater than halfSum return index+1

Below is the implementation of the above approach:

## C++

 // 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 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 functionint main(){    int arr[] = { 3, 1, 7, 1 };    int n = sizeof(arr) / sizeof(arr[0]);    cout << minElements(arr, n) << endl;    return 0;}

## Java

 // 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

 # 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 codearr = [3, 1, 7, 1]n = len(arr)print(minElements(arr, n)) # This code is contributed by "Sharad_Bhardwaj".

## C#

 // 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.

## PHP

 \$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?>

## Javascript



Output

1

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

My Personal Notes arrow_drop_up