https://leetcode.com/problems/coin-change/
正常来说这一题的考量应该是back track的dfs递归,这个在题目的solution部分也有提到。只是这种dfs递归更适合用于找到所有的解集。这种找解集数量的一般都是dp。只是这一题的dp其实挺奇怪的,我也不好说它和dfs哪个真的更好。
dp方程式是: f(n) = min(f(n), f(n - coin) + 1) (coin in coins) or f(n - coin) + 1 if f(n) not set first time.
它用于做dp的memory是O(amount),本身就比较大了。它的算法复杂度 也是O(amount * n),n是coins的个数。 至于dfs算法的复杂度是指数级的,具体咋个指数法还是看solution里面的解释吧。我就不重复了。
public int coinChange(int[] coins, int amount) {
if (amount == 0) return 0;
int[] dp = new int[amount + 1];
Arrays.fill(dp, -1);
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
if (i == coin) {
dp[i] = 1;
break;
} else if(i - coin > 0 && dp[i - coin] != -1) {
if (dp[i] == -1) {
dp[i] = dp[i - coin] + 1;
} else {
dp[i] = Math.min(dp[i - coin] + 1, dp[i]);
}
}
}
}
return dp[amount];
}