思路:一開始想起來的就是給現有的零錢進行排序,然後選取最大面值的零錢,進行回溯,找到就立即退出,這樣的做法沒有考慮到1,7,10 amount = 14這種情況,10,1,1,1,1與7,7肯定是最少兩個硬幣。如果說遍歷所有的情況,不提前退出,會出現超時的情況。那麼回溯的時候不用每次都只減乙個coins[i],而是每次減個amount/coins[i]coins[i],這樣的話也不行,沒有考慮到2,4,5 amount= 11這種情況,因為一次性減25的話,由於找不到1,結果就是-1,其實結果應該是2,4,5,結果為3
所以這道題用dfs是需要花費些心思的,還需要進行剪枝來防止超時的發生。
class
solution
else
}public
void
helper
(int
coins,
int amount,
int count,
int index)
if(index <0)
return
;for
(int k = amount/coins[index]
;k >=
0&& k + count < min;k--)}
}
第二種做法就是使用動態規劃方法
f(i)為為實現為i的錢數需要多少硬幣,總共的硬幣面額為2,3,4
f(1) = min(f(1-2),f(1-3),f(1-4))+1;
f(2)= min(f(2-2),f(2-3),f(2-4))+1;
f(3)=min(f(3-2),f(3-3),f(3-4))+1;..
.f(i) = min(f(i-2),f(i-3),f(i-4))+1;
class
solution}}
return dp[amount]
== amount+1?
-1:dp[amount];}
}
leetcode322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11輸出 3解釋 11 5 5 1 示例 2 輸入 coins 2 amount 3...
leetcode 322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1示例 2 輸入 coins 2 amount ...
LeetCode 322 零錢兌換
322 零錢兌換 題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 co...