Length of the Longest Subsequence That Sums to Target

medium dp knapsack array

Problem

Given an array of positive integers nums and an integer target, return the length of the longest subsequence of nums that adds up to exactly target. A subsequence keeps the original order but may skip elements. If no subsequence sums to target, return -1.

Inputnums = [1, 2, 3, 4, 5], target = 9
Output3
Several subsequences sum to 9, e.g. {2, 3, 4} and {1, 3, 5}. The longest of them uses 3 elements, so the answer is 3.

def length_of_longest_subsequence(nums, target):
    NEG = float("-inf")
    dp = [NEG] * (target + 1)
    dp[0] = 0
    for x in nums:
        for s in range(target, x - 1, -1):
            if dp[s - x] != NEG:
                dp[s] = max(dp[s], dp[s - x] + 1)
    return dp[target] if dp[target] != NEG else -1
function lengthOfLongestSubsequence(nums, target) {
  const NEG = -Infinity;
  const dp = new Array(target + 1).fill(NEG);
  dp[0] = 0;
  for (const x of nums) {
    for (let s = target; s >= x; s--) {
      if (dp[s - x] !== NEG) {
        dp[s] = Math.max(dp[s], dp[s - x] + 1);
      }
    }
  }
  return dp[target] !== NEG ? dp[target] : -1;
}
class Solution {
    public int lengthOfLongestSubsequence(int[] nums, int target) {
        final int NEG = Integer.MIN_VALUE;
        int[] dp = new int[target + 1];
        Arrays.fill(dp, NEG);
        dp[0] = 0;
        for (int x : nums) {
            for (int s = target; s >= x; s--) {
                if (dp[s - x] != NEG) {
                    dp[s] = Math.max(dp[s], dp[s - x] + 1);
                }
            }
        }
        return dp[target] != NEG ? dp[target] : -1;
    }
}
int lengthOfLongestSubsequence(vector<int>& nums, int target) {
    const int NEG = INT_MIN;
    vector<int> dp(target + 1, NEG);
    dp[0] = 0;
    for (int x : nums) {
        for (int s = target; s >= x; s--) {
            if (dp[s - x] != NEG) {
                dp[s] = max(dp[s], dp[s - x] + 1);
            }
        }
    }
    return dp[target] != NEG ? dp[target] : -1;
}
Time: O(n · target) Space: O(target)