Longest Increasing Subsequence having sum value atmost K

Given an integer array arr[] of size N and an integer K. The task is to find length of longest subsequence whose sum is less than or equal to K.

Example:

Input: arr[] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} K = 40
Output: 5
Explanation:
If we select subsequence {0, 1, 3, 7, 15} then total sum will be 26, which is less than 40. Hence, the longest increasing possible subsequence length is 5.
Input: arr[] = {5, 8, 3, 7, 9, 1} K = 4
Output: 1

Approach:

  1. The above problem can be solve using recursion.
    • At any position in the array, there are two choices:



    • Choose the element at that position if total sum is less than K and explore the rest items.
    • Leave the element at that position and explore the rest.

Recurrence relation will be given as:

Recurrence relation:
T(N) = max(sove(arr, N, arr[i], i+1, K-arr[i])+1, solve(arr, N, prevele, i+1, K));
Base conditions:
if(i >= N || K <= 0)
return 0

Here is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the Longest
// Increasing Subsequence having sum
// value atmost K
#include <bits/stdc++.h>
using namespace std;
  
int solve(int arr[], int N,
          int prevele, int i, int K)
{
    // check for base cases
    if (i >= N || K <= 0)
        return 0;
  
    // check if it is possible to take
    // current elements
    if (arr[i] <= prevele
        || (K - arr[i] < 0)) {
  
        return solve(arr, N, prevele,
                     i + 1, K);
    }
  
    // if current element is ignored
    else {
        int ans = max(
            solve(arr, N, arr[i],
                  i + 1, K - arr[i])
                + 1,
            solve(arr, N, prevele,
                  i + 1, K));
        return ans;
    }
}
  
// Driver Code
int main()
{
    int N = 16;
    int arr[N]
        = { 0, 8, 4, 12,
            2, 10, 6, 14,
            1, 9, 5, 13,
            3, 11, 7, 15 };
    int K = 40;
  
    cout << solve(arr, N,
                  INT_MIN, 0, K)
         << endl;
}

chevron_right


Output:

5

Time Complexity: O (2N)
Auxiliary Space: O (1)

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.