Smallest subset with sum greater than all other elements

09 Apr, 2021
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.
 
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.  
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find minimum number of// elements such that their sum is greater// than sum of remaining elements of the array.#include <bits/stdc++.h>#include <string.h>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 functionint main(){    int arr[] = {3, 1, 7, 1};    int n = sizeof(arr) / sizeof(arr[0]);    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 codearr = [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.
<?php// PHP program 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.function minElements($arr, $n){         // calculating HALF of array sum    $halfSum = 0;    for ($i = 0; $i < $n; $i++)        $halfSum = $halfSum + $arr[$i];    $halfSum = $halfSum / 2;     // sort the array in descending order.    rsort($arr);     $res = 0;    $curr_sum = 0;    for ($i = 0; $i < $n; $i++)    {        $curr_sum += $arr[$i];        $res++;         // current sum greater than sum        if ($curr_sum > $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?>
<script>    // Javascript program 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.    function minElements(arr, n)    {        // calculating HALF of array sum        let halfSum = 0;        for (let i = 0; i < n; i++)            halfSum = halfSum + arr[i];           halfSum = parseInt(halfSum / 2, 10);         // sort the array in descending order.        arr.sort(function(a, b){return a - b});        arr.reverse();         let res = 0, curr_sum = 0;        for (let i = 0; i < n; i++) {             curr_sum += arr[i];            res++;             // current sum greater than sum            if (curr_sum > halfSum)                        return res;        }        return res;    }         let arr = [3, 1, 7, 1];    let n = arr.length;    document.write(minElements(arr, n));         // This code is contributed by divyeshrabadiya07.</script>
Output:  
1
Time Complexity : O(n Log n) 
ihritik
nidhi_biet
divyeshrabadiya07
Arrays
Greedy
Sorting
Arrays
Greedy
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Arrays in Java
Write a program to reverse an array or string
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Largest Sum Contiguous Subarray
Program for array rotation
Write a program to print all permutations of a given string
Coin Change | DP-7
Program for Shortest Job First (or SJF) CPU Scheduling | Set 1 (Non- preemptive)
Minimum Number of Platforms Required for a Railway/Bus Station