给你一个下标从 0 开始的整数数组 nums 和一个整数 target 。
返回和为 target 的 nums 子序列中,子序列 长度的最大值 。如果不存在和为 target 的子序列,返回 -1 。
子序列 指的是从原数组中删除一些或者不删除任何元素后,剩余元素保持原来的顺序构成的数组。
复杂度:O(N)。
思路:0-1背包问题。
class Solution {public int lengthOfLongestSubsequence(List<Integer> nums, int target) {// 0-1背包问题/**背包容量为target物品体积为nums.get(i)物品价值均为1物品有放入与不放入两种选择dp[i] = max(dp[i], dp[i-x]+1) */int n = nums.size();int s = 0;// target为背包容量int[] dp = new int[target+1];Arrays.setAll(dp, e->Integer.MIN_VALUE);dp[0] = 0;for(int i=0; i<n; i++) {// 当前物品体积int x = nums.get(i);// 放入体积为s的物体s = Math.min(s+x, target);// 更新dp数组for(int j=s; j>=x; j--) {dp[j] = Math.max(dp[j], dp[j-x]+1);}}return dp[target]>0?dp[target]:-1;}
}