2021年9月26日 星期日

[LeetCode] 322. Coin Change

轉自LeetCode

You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money.

Return the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

You may assume that you have an infinite number of each kind of coin.

 

Example 1:

Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1

Example 2:

Input: coins = [2], amount = 3
Output: -1

Example 3:

Input: coins = [1], amount = 0
Output: 0

Example 4:

Input: coins = [1], amount = 1
Output: 1

Example 5:

Input: coins = [1], amount = 2
Output: 2

 

Constraints:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

Solution


Array 求極值,先來嘗試 DP 的解法

定義 dp[i] : amount = i 時,所需要的最少 coin 數

按照定義,dp[0] = 0,因為 amount = 0 時,不需要任何 coins

接下來看推導公式,以 dp[7],coins = [1,5] 為例

現在要計算 dp[7],能選擇的 coins 是 1 或 5

那可以看成,dp[6] 加上一枚 coin 1,或者 dp[2] 加上一枚 coin 5

因此,可以推導出,dp[i] = max(dp[i], dp[amoun - coin] + 1)

kotlin


沒有留言:

張貼留言