Longest Increasing Subsequence having sum value atmost K
Last Updated :
28 Sep, 2021
Given an integer array arr[] of size N and an integer K. The task is to find the length of the 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:
- The above problem can be solved using recursion.
- Choose the element at that position if the 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(solve(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:
C++
#include <bits/stdc++.h>
using namespace std;
int solve( int arr[], int N,
int prevele, int i, int K)
{
if (i >= N || K <= 0)
return 0;
if (arr[i] <= prevele
|| (K - arr[i] < 0)) {
return solve(arr, N, prevele,
i + 1, K);
}
else {
int ans = max(
solve(arr, N, arr[i],
i + 1, K - arr[i])
+ 1,
solve(arr, N, prevele,
i + 1, K));
return ans;
}
}
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;
}
|
Java
import java.io.*;
class GFG{
static int solve( int arr[], int N,
int prevele, int i, int K)
{
if (i >= N || K <= 0 )
return 0 ;
if (arr[i] <= prevele ||
(K - arr[i] < 0 ))
{
return solve(arr, N, prevele,
i + 1 , K);
}
else
{
int ans = Math.max(solve(arr, N, arr[i],
i + 1 , K - arr[i]) + 1 ,
solve(arr, N, prevele,
i + 1 , K));
return ans;
}
}
public static void main (String[] args)
{
int N = 16 ;
int arr[] = new int []{ 0 , 8 , 4 , 12 ,
2 , 10 , 6 , 14 ,
1 , 9 , 5 , 13 ,
3 , 11 , 7 , 15 };
int K = 40 ;
System.out.print(solve(arr, N,
Integer.MIN_VALUE, 0 , K));
}
}
|
Python3
import sys
def solve(arr, N, prevele, i, K):
if (i > = N or K < = 0 ):
return 0 ;
if (arr[i] < = prevele or
(K - arr[i] < 0 )):
return solve(arr, N, prevele,
i + 1 , K);
else :
ans = max (solve(arr, N, arr[i],
i + 1 , K - arr[i]) + 1 ,
solve(arr, N, prevele,
i + 1 , K));
return ans;
if __name__ = = '__main__' :
N = 16 ;
arr = [ 0 , 8 , 4 , 12 ,
2 , 10 , 6 , 14 ,
1 , 9 , 5 , 13 ,
3 , 11 , 7 , 15 ];
K = 40 ;
print (solve(arr, N, - sys.maxsize, 0 , K));
|
C#
using System;
class GFG{
static int solve( int [] arr, int N,
int prevele, int i, int K)
{
if (i >= N || K <= 0)
return 0;
if (arr[i] <= prevele ||
(K - arr[i] < 0))
{
return solve(arr, N, prevele,
i + 1, K);
}
else
{
int ans = Math.Max(solve(arr, N, arr[i],
i + 1, K - arr[i]) + 1,
solve(arr, N, prevele,
i + 1, K));
return ans;
}
}
public static void Main ()
{
int N = 16;
int [] arr = new int []{ 0, 8, 4, 12,
2, 10, 6, 14,
1, 9, 5, 13,
3, 11, 7, 15 };
int K = 40;
Console.Write(solve(arr, N,
Int32.MinValue, 0, K));
}
}
|
Javascript
<script>
function solve(arr, N, prevele, i, K)
{
if (i >= N || K <= 0)
return 0;
if (arr[i] <= prevele
|| (K - arr[i] < 0)) {
return solve(arr, N, prevele,
i + 1, K);
}
else {
var ans = Math.max(
solve(arr, N, arr[i],
i + 1, K - arr[i])
+ 1,
solve(arr, N, prevele,
i + 1, K));
return ans;
}
}
var N = 16;
var arr
= [0, 8, 4, 12,
2, 10, 6, 14,
1, 9, 5, 13,
3, 11, 7, 15];
var K = 40;
document.write( solve(arr, N,
-1000000000, 0, K));
</script>
|
Time Complexity: O (2N)
Auxiliary Space: O (1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...