给定一个大小为N的整数数组arr []和一个整数K。任务是找到最长子序列的总和小于或等于K的长度。
例子:
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
方法:
- 可以使用递归来解决上述问题。
-
- 在数组的任何位置,有两种选择:
- 如果总和小于K ,则在该位置选择元素,然后浏览其余项。
- 将元素保留在该位置,然后探索其余元素。
递归关系将给出为:
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
这是上述方法的实现:
C++
// C++ program to find the Longest
// Increasing Subsequence having sum
// value atmost K
#include
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;
}
Java
// Java program to find the Longest
// Increasing Subsequence having sum
// value atmost K
import java.io.*;
class GFG{
static 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 = Math.max(solve(arr, N, arr[i],
i + 1, K - arr[i]) + 1,
solve(arr, N, prevele,
i + 1, K));
return ans;
}
}
// Driver code
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));
}
}
// This code is contributed by Pratima Pandey
Python3
# Python3 program to find the Longest
# Increasing Subsequence having sum
# value atmost K
import sys
def solve(arr, N, prevele, i, K):
# Check for base cases
if (i >= N or K <= 0):
return 0;
# Check if it is possible to take
# current elements
if (arr[i] <= prevele or
(K - arr[i] < 0)):
return solve(arr, N, prevele,
i + 1, K);
# If current element is ignored
else:
ans = max(solve(arr, N, arr[i],
i + 1, K - arr[i]) + 1,
solve(arr, N, prevele,
i + 1, K));
return ans;
# Driver code
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));
# This code is contributed by 29AjayKumar
C#
// C# program to find the Longest
// Increasing Subsequence having sum
// value atmost K
using System;
class GFG{
static 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 = Math.Max(solve(arr, N, arr[i],
i + 1, K - arr[i]) + 1,
solve(arr, N, prevele,
i + 1, K));
return ans;
}
}
// Driver code
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));
}
}
// This code is contributed by sanjoy_62
输出:
5
时间复杂度: O(2 N )
辅助空间: O(1)