动态规划整合(持续更新)

子集合问题

叙述:求解一个数target是否可以由nums集合里面的数的和构成,元素可重复使用

public boolean repetion(int target, int nums[]) {

        boolean dp[] = new boolean[target + 1];
        //  dp起点
        dp[0] = true;
        for (int i = 0; i <= target; i++) {
            if (dp[i]) {
                for (int num : nums) {
                    if (i + num == target) return true;
                    else if (i + num < target) dp[i + num] = true;
                }
            }
        }
        return dp[target];
    }

子集合问题.II (元素不可重复使用)

叙述:求解一个数target是否可以由nums集合里面的数的和构成,元素不可重复使用 -> 0-1背包

public boolean unique(int target, int nums[]){

        boolean dp[] = new boolean[target + 1];
        //  dp起点
        dp[0] = true;
        //  num变为外层循环,因为每个数只能用一遍。
        for(int num:nums){
            //  倒着减,避免刚刚被更新为true的j又去更新j+num,导致num使用多次
            for(int j = target;j-num>=0;j--){
                dp[j] = dp[j-num];
            }
        }

        return dp[target];
    }

你可能感兴趣的:(leetcode,算法)