原题链接:https://leetcode-cn.com/problems/combination-sum-iv
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
nums = [1, 2, 3]
target = 4
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。
因此输出为 7。
解题思路:
本来计划使用回溯的方式,求出结果之后再求长度即可,但是这样会超时。
源码:
public int combinationSum4(int[] nums, int target) { List<Integer> result=new ArrayList<>(); result.add(0); backtrack(result,nums,target,0); return result.get(0); } public void backtrack(List<Integer> result,int[] nums, int target,int sum ) { if (sum == target) { int num=result.get(0); result.remove(0); result.add(num+1); return; } if (sum > target) { return; } for (int i = 0; i < nums.length; i++) { if (sum + nums[i] <= target) { backtrack( result,nums, target, sum + nums[i]); } } }
所以只能使用动态规划来完成了。
声明dp数组,dp[i] 表示和为i 的时候有多少种情况。
动态变化为
dp[i] = dp[i]+dp[i-num] (i-num 要>=0)
public int combinationSum4(int[] nums, int target) { int[] dp = new int[target+1]; for(int i=0;i<dp.length;i++) dp[i]=0; dp[0]=1; for(int i=1;i<=target;i++){ for(int num:nums){ if(i-num>=0){ dp[i]=dp[i]+dp[i-num]; } } } return dp[target] ; }