题目:
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
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。 第一次做觉得就是个简单的完全背包问题, 直接一维数组,两层for循环,第一层循环遍历数组元素,第二层循环从前往后更新dp
发现写完之后运行测试案例只有4,不是题目中的7,少了几种情况,
网上找了答案,只要把两个for循环的顺序反一下就好了,不懂什么原理/(ㄒoㄒ)/~~
class Solution {
public int combinationSum4(int[] nums, int target) {
if(nums == null || nums.length == 0)
return 0;
int[] dp = new int[target+1];
dp[0] = 1;
for(int j = 1; j <= target; j++){
for(int i = 0; i < nums.length; i++){
if(j >= nums[i])
dp[j] += dp[j-nums[i]];
}
}
return dp[target];
}
}