Find the smallest positive integer value that cannot be represented as sum of any subset of a given array

23 Jun, 2022
Given an array of positive numbers, find the smallest positive integer value that cannot be represented as the sum of elements of any subset of a given set. The expected time complexity is O(nlogn).
Examples: 
Input:  arr[] = {1, 10, 3, 11, 6, 15};
Output: 2

Input:  arr[] = {1, 1, 1, 1};
Output: 5

Input:  arr[] = {1, 1, 3, 4};
Output: 10

Input:  arr[] = {1, 2, 5, 10, 20, 40};
Output: 4

Input:  arr[] = {1, 2, 3, 4, 5, 6};
Output: 22
A Simple Solution is to start from value 1 and check all values one by one if they can sum to values in the given array. This solution is very inefficient as it reduces to the subset sum problem which is a well-known NP-Complete Problem.
Using a simple loop, we can solve this problem in O(N log N) time. Let the input array be arr[0..n-1]. We first sort the array in non-decreasing order. Let the smallest element that cannot be represented by elements at indexes from 0 to (i-1) be ‘res’.  We initialize ‘res’ as 1 (smallest possible answer) and traverse the given array from i=0.  There are the following two possibilities when we consider element at index i:
We decide that ‘res’ is the final result: If arr[i] is greater than ‘res’, then we found the gap which is ‘res’ because the elements after arr[i] are also going to be greater than ‘res’.The value of ‘res’ is incremented after considering arr[i]: If arr[i] is not greater than ‘res’, the value of ‘res’ is incremented by arr[i] so ‘res’ = ‘res’+arr[i] (why? If elements from 0 to (i-1) can 
We decide that ‘res’ is the final result: If arr[i] is greater than ‘res’, then we found the gap which is ‘res’ because the elements after arr[i] are also going to be greater than ‘res’.
The value of ‘res’ is incremented after considering arr[i]: If arr[i] is not greater than ‘res’, the value of ‘res’ is incremented by arr[i] so ‘res’ = ‘res’+arr[i] (why? If elements from 0 to (i-1) can 
represent 1 to ‘res-1’, then elements from 0 to i can represent from 1 to ‘res + arr[i] – 1’ by adding arr[i] to all subsets that represent 1 to ‘res-1’ which we have already determined to be represented)Following is the implementation of the above idea. 
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find the smallest positive value that cannot be// represented as sum of subsets of a given sorted array#include<iostream>#include<vector>#include<algorithm>using namespace std; // Returns the smallest number that cannot be represented as sum// of subset of elements from set represented by sorted array arr[0..n-1]long long smallestpositive(vector<long long> arr, int n) {   long long int res = 1; // Initialize result     sort(arr.begin(), arr.end());   // Traverse the array and increment 'res' if arr[i] is   // smaller than or equal to 'res'.   for (int i = 0; i < n && arr[i] <= res; i++)       res = res + arr[i];     return res;  } // Driver program to test above functionint main() {   vector<long long> arr1 = {1, 3, 4, 5};   cout << smallestpositive(arr1, arr1.size()) << endl;     vector<long long> arr2 = {1, 2, 6, 10, 11, 15};   cout << smallestpositive(arr2, arr2.size()) << endl;     vector<long long> arr3 = {1, 1, 1, 1};   cout << smallestpositive(arr3, arr3.size()) << endl;     vector<long long> arr4 = {1, 1, 3, 4};   cout << smallestpositive(arr4, arr4.size()) << endl;     return 0; }
// Java program to find the smallest positive value that cannot be// represented as sum of subsets of a given sorted arrayimport java.util.Arrays; class FindSmallestInteger{    // Returns the smallest number that cannot be represented as sum    // of subset of elements from set represented by sorted array arr[0..n-1]    int findSmallest(int arr[], int n)    {        int res = 1; // Initialize result           // sort the input array          Arrays.sort(arr);               // Traverse the array and increment 'res' if arr[i] is        // smaller than or equal to 'res'.        for (int i = 0; i < n; i++)        {          if(arr[i] > res){            return res;           }          else{            res+=arr[i];          }        }                     return res;    }     // Driver program to test above functions    public static void main(String[] args)    {        FindSmallestInteger small = new FindSmallestInteger();        int arr1[] = {1, 3, 4, 5};        int n1 = arr1.length;        System.out.println(small.findSmallest(arr1, n1));         int arr2[] = {1, 2, 6, 10, 11, 15};        int n2 = arr2.length;        System.out.println(small.findSmallest(arr2, n2));         int arr3[] = {1, 1, 1, 1};        int n3 = arr3.length;        System.out.println(small.findSmallest(arr3, n3));         int arr4[] = {1, 1, 3, 4};        int n4 = arr4.length;        System.out.println(small.findSmallest(arr4, n4));     }} // This code has been contributed by Mukul Sharma (msharma04)
# Python3 program to find the smallest# positive value that cannot be# represented as sum of subsets# of a given sorted array # Returns the smallest number# that cannot be represented as sum# of subset of elements from set# represented by sorted array arr[0..n-1]def findSmallest(arr, n):     res = 1 #Initialize result     # Traverse the array and increment    # 'res' if arr[i] is smaller than    # or equal to 'res'.    for i in range (0, n ):        if arr[i] <= res:            res = res + arr[i]        else:            break    return res  # Driver program to test above functionarr1 = [1, 3, 4, 5]n1 = len(arr1)print(findSmallest(arr1, n1)) arr2= [1, 2, 6, 10, 11, 15]n2 = len(arr2)print(findSmallest(arr2, n2)) arr3= [1, 1, 1, 1]n3 = len(arr3)print(findSmallest(arr3, n3)) arr4 = [1, 1, 3, 4]n4 = len(arr4)print(findSmallest(arr4, n4)) # This code is.contributed by Smitha Dinesh Semwal
// C# program to find the smallest// positive value that cannot be// represented as sum of subsets// of a given sorted arrayusing System; class GFG {         // Returns the smallest number that    // cannot be represented as sum    // of subset of elements from set    // represented by sorted array    // arr[0..n-1]    static int findSmallest(int []arr, int n)    {         // Initialize result         int res = 1;         // Traverse the array and        // increment 'res' if arr[i] is        // smaller than or equal to 'res'.        for (int i = 0; i < n &&             arr[i] <= res; i++)            res = res + arr[i];         return res;    }     // Driver code    public static void Main()    {        int []arr1 = {1, 3, 4, 5};        int n1 = arr1.Length;        Console.WriteLine(findSmallest(arr1, n1));         int []arr2 = {1, 2, 6, 10, 11, 15};        int n2 = arr2.Length;        Console.WriteLine(findSmallest(arr2, n2));         int []arr3 = {1, 1, 1, 1};        int n3 = arr3.Length;        Console.WriteLine(findSmallest(arr3, n3));         int []arr4 = {1, 1, 3, 4};        int n4 = arr4.Length;        Console.WriteLine(findSmallest(arr4, n4));     }} // This code is contributed by Sam007
<?php// PHP program to find the smallest// positive value that cannot be// represented as sum of subsets// of a given sorted array // Returns the smallest number that// cannot be represented as sum of// subset of elements from set// represented by sorted array// arr[0..n-1]function findSmallest($arr, $n){         // Initialize result    $res = 1;         // Traverse the array and    // increment 'res' if arr[i] is    // smaller than or equal to 'res'.    for($i = 0; $i < $n and $arr[$i] <= $res; $i++)        $res = $res + $arr[$i];         return $res;} // Driver Code$arr1 = array(1, 3, 4, 5);$n1 = count($arr1);echo findSmallest($arr1, $n1),"\n"; $arr2 = array(1, 2, 6, 10, 11, 15);$n2 = count($arr2);echo findSmallest($arr2, $n2),"\n" ; $arr3 = array(1, 1, 1, 1);$n3 = count($arr3);echo findSmallest($arr3, $n3),"\n"; $arr4 = array(1, 1, 3, 4);$n4 = count($arr4);echo findSmallest($arr4, $n4); // This code is contributed by anuj_67.?>
<script>// javascript program to find the smallest positive value that cannot be// represented as sum of subsets of a given sorted array     // Returns the smallest number that cannot be represented as sum    // of subset of elements from set represented by sorted array arr[0..n-1]    function findSmallest(arr , n)    {        var res = 1; // Initialize result         // Traverse the array and increment 'res' if arr[i] is        // smaller than or equal to 'res'.        for (i = 0; i < n && arr[i] <= res; i++)            res = res + arr[i];         return res;    }     // Driver program to test above functions         var arr1 = [ 1, 3, 4, 5 ];        var n1 = arr1.length;        document.write(findSmallest(arr1, n1)+"<br/>");         var arr2 = [ 1, 2, 6, 10, 11, 15 ];        var n2 = arr2.length;        document.write(findSmallest(arr2, n2)+"<br/>");         var arr3 = [ 1, 1, 1, 1 ];        var n3 = arr3.length;        document.write(findSmallest(arr3, n3)+"<br/>");         var arr4 = [ 1, 1, 3, 4 ];        var n4 = arr4.length;        document.write(findSmallest(arr4, n4)+"<br/>"); // This code is contributed by aashish1995</script>
2
4
5
10
The Time Complexity of the above program is O(nlogn). 
The Space Complexity is O(1) in best case for heap sort.  
Sam007
vt_m
aashish1995
krishan21723
nush1501
mdsheraj
msharma04
technophpfij
hardikkoriintern
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.