package main
import "fmt"
// Recursive solution: tries all combinations
func minCoinsRec(coins []int, amount int) int {
if amount == 0 {
return 0
}
res := 1 << 30 // large number
for _, c := range coins {
if c <= amount {
subRes := minCoinsRec(coins, amount-c)
if subRes != 1<<30 && subRes+1 < res {
res = subRes + 1
}
}
}
return res
}
// Greedy solution: picks largest coin first
func minCoinsGreedy(coins []int, amount int) int {
count := 0
for amount > 0 {
maxCoin := 0
for _, c := range coins {
if c <= amount && c > maxCoin {
maxCoin = c
}
}
if maxCoin == 0 {
return -1 // no solution
}
amount -= maxCoin
count++
}
return count
}
// DP solution: stores minimum coins for each amount
func minCoinsDP(coins []int, amount int) int {
dp := make([]int, amount+1)
for i := 1; i <= amount; i++ {
dp[i] = 1 << 30
for _, c := range coins {
if c <= i && dp[i-c] != 1<<30 && dp[i-c]+1 < dp[i] {
dp[i] = dp[i-c] + 1
}
}
}
if dp[amount] == 1<<30 {
return -1
}
return dp[amount]
}
func main() {
coins := []int{1, 3, 4}
amount := 6
fmt.Println("Recursion result:", minCoinsRec(coins, amount))
fmt.Println("Greedy result:", minCoinsGreedy(coins, amount))
fmt.Println("DP result:", minCoinsDP(coins, amount))
}for _, c := range coins { if c <= amount { subRes := minCoinsRec(coins, amount-c) ... } }
try all coin choices recursively to find minimum coins
for amount > 0 { find maxCoin <= amount; amount -= maxCoin; count++ }
pick largest coin possible greedily until amount is zero
for i := 1; i <= amount; i++ { for _, c := range coins { if c <= i { dp[i] = min(dp[i], dp[i-c]+1) } } }
build dp table bottom-up storing minimum coins for each amount
Recursion result: 2
Greedy result: 3
DP result: 2