思路
- 完全背包问题(可以重复选择) 思路和上一道题类似~
- 设f(i)为用数组所有元素凑成i的可能的数目,那么有f(i) = Σ f(i-nums[j]),比如数组元素为[1,2,3] 需要凑8,那么某一步需要求f(5),也就是说凑成5的可能的数目。那么这个可能的总数有三种 先凑4再加上1,先凑3再加上2,先凑2再加上3。所以凑成和为5的可能数目就是上述三个数目的和
- 边界情况 f(0) = 1 于此同时还有凑不成的情况 所以我们最初可以把数组所有元素初始化为0
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
Arrays.sort(nums);
for(int i = 1 ; i <= target ; i++){
for(int num :nums){
if(i >= num)
dp[i] += dp[i-num] ;
else
break;
}
}
return dp[target];
}
}