<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 lengthOfLongestSubsequence(self, nums: List[int], target: int) -> int:
        '''
        dp[i][j] store the longest length of subsequence sums up target:
            i: with the first ith element in nums
            j: targeting at j
        dp[i+1][j+1] = max(dp[i][j+1], dp[i][j+1-num]+1)
        '''
        dp = [[-1]*(target+1) for _ in range(len(nums)+1)]
        dp[0][0] = 0
        print(dp[0])
        for i,num in enumerate(nums):
            dp[i+1][0] = 0
            # for j in range(target-1,-1,-1):
            for j in range(target):
                # print(dp[i][j+1],dp[i][j+1-num])
                if dp[i][j+1]>=0:
                    dp[i+1][j+1] = max(dp[i+1][j+1],dp[i][j+1])
                # print(i, j, j+1-num)
                try:
                    if j+1-num>=0 and dp[i][j+1-num]>=0:
                        dp[i+1][j+1] = max(dp[i+1][j+1],dp[i][j+1-num]+1)
                except:
                    print(i, j, j+1-num)
            # print(dp[i+1])
        return dp[-1][-1] 


        # for i, num in enumerate(nums):
        #     dp[i + 1][0] = 0  # 初始时，和为 0 的最长子序列长度为 0
        #     for j in range(target + 1):  # 修正为从 0 到 target 遍历，确保索引正确
        #         # 保留不选择当前元素的情况
        #         if dp[i][j] >= 0:
        #             dp[i + 1][j] = max(dp[i + 1][j], dp[i][j])
        #         # 选择当前元素 num 的情况
        #         if j >= num and dp[i][j - num] >= 0:  # 检查 j-num 是否不越界
        #             dp[i + 1][j] = max(dp[i + 1][j], dp[i][j - num] + 1)
        
        # return dp[len(nums)][target]  # 如果找不到合法解，返回 0

6464