LeetCode 377 组合总数IV

LeetCode 377 组合总数IV

题目描述:
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

动态规划

  • 动态规划解法的设计(状态定义、状态转移)可以从递归解法开始
  • 在递归解法中,每一次从数组中任选一个数nums[i],则子问题是同样的nums下找到的和为taget-nums[i]的组合数量
  • 因此将状态定义为: dp[target] 表示nums中找到的和为target的组合数目
  • 状态转移为: dp[target] = 求和(0=<i<=nums.length) dp[target-nums[i]],其中nums[i]满足小于等于target

执行用时:1 ms, 在所有 Java 提交中击败了99.68%的用户
内存消耗:37.1 MB, 在所有 Java 提交中击败了28.93%的用户

class Solution {
    public int combinationSum4(int[] nums, int target) {
        //DP[S]表示nums数组构成的和为S的组合个数
        //DP[S] = 求和 DP[S-nums[i]], num[i] <= S, 0=<i<nums.length
        int[] dp = new int[target+1];
        dp[0] = 1;

        /*递推*/
        for(int sum=1; sum<=target; sum++) {
            for(int curr=0; curr<nums.length; curr++) {
                if(nums[curr]<=sum) {
                    dp[sum] += dp[sum-nums[curr]];
                }
            }
        }

        return dp[target];

    }
}
原文地址:https://www.cnblogs.com/CodeSPA/p/13575637.html