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];
}
}