hello-algo/zh-hant/codes/swift/chapter_dynamic_programming/coin_change.swift

70 lines
2.0 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* File: coin_change.swift
* Created Time: 2023-07-15
* Author: nuomi1 (nuomi1@qq.com)
*/
/* */
func coinChangeDP(coins: [Int], amt: Int) -> Int {
let n = coins.count
let MAX = amt + 1
// dp
var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)
//
for a in 1 ... amt {
dp[0][a] = MAX
}
//
for i in 1 ... n {
for a in 1 ... amt {
if coins[i - 1] > a {
// i
dp[i][a] = dp[i - 1][a]
} else {
// i
dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)
}
}
}
return dp[n][amt] != MAX ? dp[n][amt] : -1
}
/* */
func coinChangeDPComp(coins: [Int], amt: Int) -> Int {
let n = coins.count
let MAX = amt + 1
// dp
var dp = Array(repeating: MAX, count: amt + 1)
dp[0] = 0
//
for i in 1 ... n {
for a in 1 ... amt {
if coins[i - 1] > a {
// i
dp[a] = dp[a]
} else {
// i
dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)
}
}
}
return dp[amt] != MAX ? dp[amt] : -1
}
@main
enum CoinChange {
/* Driver Code */
static func main() {
let coins = [1, 2, 5]
let amt = 4
//
var res = coinChangeDP(coins: coins, amt: amt)
print("湊到目標金額所需的最少硬幣數量為 \(res)")
//
res = coinChangeDPComp(coins: coins, amt: amt)
print("湊到目標金額所需的最少硬幣數量為 \(res)")
}
}