解题思路
记忆化搜索
代码
class Solution {
Set<String> set = new HashSet<String>();
int[][] memo;
public int change(int amount, int[] coins) {
memo = new int[coins.length][amount+1];//记忆数组
Arrays.sort(coins);
return backtrack(amount,coins,0,0);
}
public int backtrack(int amount, int[] coins,int cur,int index){
if(memo[index][cur]!=0){
return memo[index][cur];
}
if(cur==amount) {//可以组成amount
return 1;
}
int ans = 0;
for(int i=index;i<coins.length;i++){
if(amount-cur<coins[i]){//当前处的coins已经大于剩余价值,所以可以直接break
break;
}
ans += backtrack(amount,coins,cur+coins[i],i);
}
memo[index][cur] = ans;
return ans;
}
}