100042. 和为目标值的最长子序列的长度

给你一个下标从 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;
    }
}

你可能感兴趣的:(算法,leetcode,数据结构)