题目:
分析:一看题目发现和另一题很像,这样的组合总问题,零钱兑换2可看这里,但本题有点不同,这里要求一个全排列,求所有情况,零钱兑换2里要求的是所求金额的组合数(不可以逆序),又有一道很像的题,可看这里,这题零钱兑换中其实就求了所有的解,那我们只要用同样的算法,不过这次记录的是组合的数量即可
注意: 顺序不同的序列被视作不同的组合这个条件刚好就对应与所有的解,如果用回溯的方法像求不同序列视作同一组合的话会超时
代码:
class Solution {
public int combinationSum4(int[] nums, int target) {
if(nums == null || nums.length == 0){
return 0;
}
Arrays.sort(nums);
int[] dp = new int[target+1];
dp[0] = 1;
for(int i = 1; i <= target; i++){
//因为每次都从头遍历nums,所以考虑了所有的组合情况
for(int j = 0; j < nums.length; j++){
if(nums[j] <= i){
dp[i] += dp[i-nums[j]];
}
}
}
return dp[target];
}
}