題目:
分析:一看題目發現和另一題很像,這樣的組合總問題和零錢兌換很類似,不過是換了一個表述而已,零錢兌換可看這裏,零錢兌換裏要求的是所求金額的組合的最小硬幣數,我們的做法是從1遍歷到所求金額,求出所有金額的解,但該問題求的組合的最小硬幣數。這道題求的是組合數,但零錢兌換中其實就求了所有的解,那我們只要用同樣的算法,不過這次記錄的是組合的數量即可
注意: 順序不同的序列被視作不同的組合這個條件剛好就對應與所有的解,如果用回溯的方法像求不同序列視作同一組合的話會超時
代碼:
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];
}
}