Check whether a subsequence exists with sum equal to k if arr[i]> 2*arr[i-1]

Given a sorted array of positive integers where arr[i] > 2*arr[i-1], check whether a sub sequence exists whose sum is equal to k.

Examples:

Input : arr[]={ 1, 3, 7, 15, 31}, K=18
Output :True
A[1] + A[3] = 3 + 15 = 18
We found a subsequence whose sum is 18
Input :arr[]={ 1, 3, 7, 15, 31}, K=20
Output :False
No subsequence can be found with sum 20

Naive Solution: The basic solution is to check for all the 2^n possible combinations and check if there is any subsequence whose sum is equal to K. This process will not work for higher values of N, N>20.
Time Complexity: O(2^N)

Efficient Solution: We are given arr[i] >2*arr[i-1] so we can say that arr[i] > ( arr[i-1] + arr[i-2] + …+ arr[2] + arr[1] + arr[0] ).

Let us assume that arr[i] <= K ( arr[i-1] + arr[i-2] + …+ arr[2] + arr[1] + arr[0] ) ), so we have to include arr[i] in the set . So, we have to traverse the array in descending order and when we find arr[i]<=k, we will include arr[i] in the set and subtract arr[i] from K and continue the loop until value of K is equal to zero.

If the value of K is zero then there is a subsequence else not.

Below is the Implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of above approach
#include <iostream>
using namespace std;
  
// Fucntion to check whether sum of any set
// of the array element is equal
// to k or not
bool CheckForSequence(int arr[], int n, int k)
{
    // Traverse the array from end
    // to start
    for (int i = n - 1; i >= 0; i--) {
        // if k is greater than
        // arr[i] then substract
        // it from k
        if (k >= arr[i])
            k -= arr[i];
    }
  
    // If there is any subsequence
    // whose sum is equal to k
    if (k != 0)
        return false;
    else
        return true;
}
  
// Diver code
int main()
{
    int A[] = { 1, 3, 7, 15, 31 };
    int n = sizeof(A) / sizeof(int);
    cout << (CheckForSequence(A, n, 18)
                 ? "True": "False") << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of above approach
import java.io.*;
  
class GFG 
{
      
// Function to check whether 
// sum of any set of the array element 
// is equal to k or not
static boolean CheckForSequence(int arr[],
                                int n, int k)
{
    // Traverse the array from end
    // to start
    for (int i = n - 1; i >= 0; i--) 
    {
        // if k is greater than
        // arr[i] then substract
        // it from k
        if (k >= arr[i])
            k -= arr[i];
    }
  
    // If there is any subsequence
    // whose sum is equal to k
    if (k != 0)
        return false;
    else
        return true;
}
  
// Diver code
public static void main (String[] args) 
{
  
    int A[] = { 1, 3, 7, 15, 31 };
    int n = A.length;
    System.out.println(CheckForSequence(A, n, 18) ? 
                                            "True": "False");
}
}
  
// This code is contributed by jit_t

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of above approach 
  
# Fucntion to check whether sum of any set 
# of the array element is equal 
# to k or not 
def CheckForSequence(arr, n, k) :
  
    # Traverse the array from end 
    # to start 
    for i in range(n - 1, -1, -1) :
        # if k is greater than 
        # arr[i] then substract 
        # it from k 
        if (k >= arr[i]) :
            k -= arr[i]; 
  
    # If there is any subsequence 
    # whose sum is equal to k 
    if (k != 0) :
        return False
    else :
        return True
  
# Diver code 
if __name__ == "__main__"
  
    A = [ 1, 3, 7, 15, 31 ]; 
    n = len(A); 
      
    if (CheckForSequence(A, n, 18)) :
        print(True)
    else :
        print(False)
          
# This code is contributed by AnkitRai01

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach
using System;
  
class GFG 
{
      
// Function to check whether 
// sum of any set of the array element 
// is equal to k or not
static bool CheckForSequence(int []arr,
                                int n, int k)
{
    // Traverse the array from end
    // to start
    for (int i = n - 1; i >= 0; i--) 
    {
        // if k is greater than
        // arr[i] then substract
        // it from k
        if (k >= arr[i])
            k -= arr[i];
    }
  
    // If there is any subsequence
    // whose sum is equal to k
    if (k != 0)
        return false;
    else
        return true;
}
  
// Diver code
public static void Main () 
{
  
    int []A = { 1, 3, 7, 15, 31 };
    int n = A.Length;
    Console.WriteLine(CheckForSequence(A, n, 18) ? 
                                            "True": "False");
}
}
  
// This code is contributed by anuj_67..

chevron_right


Output:

True

Time Complexity : O(N)



My Personal Notes arrow_drop_up

Second year Department of Information Technology Jadavpur University

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 : AnkitRai01, jit_t, vt_m