Skip to content
Related Articles
Check whether a subsequence exists with sum equal to k if arr[i]> 2*arr[i-1]
• Difficulty Level : Medium
• Last Updated : 29 Apr, 2021

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 + A = 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 + arr + arr ).
Let us assume that arr[i] <= K ( arr[i-1] + arr[i-2] + …+ arr + arr + arr ) ), 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++

 `// C++ implementation of above approach``#include ``using` `namespace` `std;` `// Function 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 subtract``        ``// 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``;``}` `// Driver 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;``}`

## Java

 `// 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 subtract``        ``// 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``;``}` `// Driver 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`

## Python3

 `# Python3 implementation of above approach` `# Function 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 subtract``        ``# 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``;` `# Driver 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`

## C#

 `// 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 subtract``        ``// 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``;``}` `// Driver 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..`

## Javascript

 ``
Output:
`True`

Time Complexity : O(N)

Attention reader! Don’t stop learning now. Get hold of all the important Comcompetitivepetitve Programming concepts with the Competitive Programming Live  course.

My Personal Notes arrow_drop_up