描述
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
分析
“组合总和” 系列题解汇总:
39. 组合总和
40. 组合总和 II
216. 组合总和 III
377. 组合总和 Ⅳ
不同于前三道题,本题是求个数,是完全背包的解题思路,并且是排列问题,不是组合问题。
相比于让外循环物品内循环背包,外循环背包内循环物品能够穷尽某一背包容量下,物品的排列组合。
比如,示例一中,如果外循环物品内循环背包,就不可能出现(1, 2, 1)、(2, 1, 1)、(3, 1)这三种情况,因为物品1已经在第一次外循环中穷尽了,1只能出现在2,3的前面,不能出现在2,3的后面,但是外循环背包,内循环物品却可以避免这种情况。
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target+1];
dp[0] = 1;
for(int i = 1; i <= target; i++){
for(int j = 0; j < nums.length; j++){
if(i >= nums[j]){
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
}
}