1. 程式人生 > 實用技巧 >[leetcode/lintcode 題解] 位元組跳動面試題:換硬幣

[leetcode/lintcode 題解] 位元組跳動面試題:換硬幣

給出不同面額的硬幣以及一個總金額. 寫一個方法來計算給出的總金額可以換取的最少的硬幣數量. 如果已有硬幣的任意組合均無法與總金額面額相等, 那麼返回 -1. 線上評測地址:領釦題庫官網 樣例1 輸入: [1, 2, 5] 11 輸出: 3 解釋: 11 = 5 + 5 + 1 樣例2 輸入: [2] 3 輸出: -1 題解 這是一個典型的完全揹包問題,在動態規劃專題班中侯衛東老師有詳細講解。
設dpi表示使用前i個硬幣,總金額為j時需要的最少硬幣數量。 dp[i][j]=max(dp[i−1][j],dp[i−1][j−k∗coin[i]]+k)(0≤k∗coin[i]≤j) public
class Solution {
public int coinChange(int[] A, int M) { int[] f = new int[M + 1]; int n = A.length; f[0] = 0; int i, j; for (i = 1; i <= M; ++i) { f[i] = -1; for (j = 0; j < n; ++j) { if (i >= A[j] && f[i - A[j]] != -1) { if (f[i] == -1 || f[i - A[j]] + 1 < f[i]) {
f[i] = f[i - A[j]] + 1; } } } } return f[M]; } } 更多題解參考:九章官網solution