<p>You are given a <strong>0-indexed</strong> array of integers <code>nums</code>, and an integer <code>target</code>.</p>

<p>Return <em>the <strong>length of the longest subsequence</strong> of</em> <code>nums</code> <em>that sums up to</em> <code>target</code>. <em>If no such subsequence exists, return</em> <code>-1</code>.</p>

<p>A <strong>subsequence</strong> is an array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,3,4,5], target = 9
<strong>Output:</strong> 3
<strong>Explanation:</strong> There are 3 subsequences with a sum equal to 9: [4,5], [1,3,5], and [2,3,4]. The longest subsequences are [1,3,5], and [2,3,4]. Hence, the answer is 3.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [4,1,3,2,1,5], target = 7
<strong>Output:</strong> 4
<strong>Explanation:</strong> There are 5 subsequences with a sum equal to 7: [4,3], [4,1,2], [4,2,1], [1,1,5], and [1,3,2,1]. The longest subsequence is [1,3,2,1]. Hence, the answer is 4.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,1,5,4,5], target = 3
<strong>Output:</strong> -1
<strong>Explanation:</strong> It can be shown that nums has no subsequence that sums up to 3.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 1000</code></li>
	<li><code>1 &lt;= nums[i] &lt;= 1000</code></li>
	<li><code>1 &lt;= target &lt;= 1000</code></li>
</ul>

# class Solution:
#     def dp(self,nums,i,sumi,count,target):
#         if sumi>target:
#             return 0
#         if i >= len(nums):
#             if sumi == target:
#                 return count
#             return 0
#         if sumi==target:
#             return count
#         p=self.dp(nums,i+1,sumi+nums[i],count+1,target)
#         np=self.dp(nums,i+1,sumi,count,target)
#         return max(p,np)

#     def lengthOfLongestSubsequence(self, nums: List[int], target: int) -> int:
#         p = self.dp(nums,0,0,0,target)
#         if p==0:
#             return -1
#         return p


class Solution:
    def dp(self,nums,i,sumi,count,target,dp):
        if sumi>target:
            return 0
        if i >= len(nums):
            if sumi == target:
                return count
            return 0
        if sumi==target:
            return count
        if dp[i][sumi]!=-1:
            return dp[i][sumi]
        p=self.dp(nums,i+1,sumi+nums[i],count+1,target,dp)
        np=self.dp(nums,i+1,sumi,count,target,dp)
        dp[i][sumi] = max(p,np)
        return dp[i][sumi]

    def lengthOfLongestSubsequence(self, nums: List[int], target: int) -> int:
        nums=sorted(nums)
        n = len(nums)
        dp = [[-1 for _ in range(target + 1)] for _ in range(n + 1)]
        p = self.dp(nums,0,0,0,target,dp)
        if p==0:
            return -1
        return p
4931