# 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 + 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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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

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, nidhi_biet