package main
import (
"fmt"
"math"
)
// Fungsi untuk mengecek apakah kembalian bisa dibentuk dengan koin yang ada
func canMakeChange(coins []int, amount int) bool {
dp := make([]bool, amount+1)
dp[0] = true
for _, coin := range coins {
for i := coin; i <= amount; i++ {
if dp[i-coin] {
dp[i] = true
}
}
}
return dp[amount]
}
// Fungsi untuk menghitung jumlah minimum koin yang diperlukan
func minCoins(coins []int, amount int) int {
dp := make([]int, amount+1)
for i := range dp {
dp[i] = math.MaxInt32
}
dp[0] = 0
for _, coin := range coins {
for i := coin; i <= amount; i++ {
dp[i] = min(dp[i], dp[i-coin]+1)
}
}
if dp[amount] == math.MaxInt32 {
return -1
}
return dp[amount]
}
// Fungsi untuk menghitung jumlah kombinasi koin yang bisa membentuk nilai kembalian
func countWays(coins []int, amount int) int {
dp := make([]int, amount+1)
dp[0] = 1
for _, coin := range coins {
for i := coin; i <= amount; i++ {
dp[i] += dp[i-coin]
}
}
return dp[amount]
}
// Fungsi untuk menghitung nilai minimum antara dua integer
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
coins := []int{1, 2, 5, 10}
amount := 100 - 63 // Kembalian adalah 37
// a. Apakah nominal kembalian dapat dibentuk dari koin pecahan tersebut?
canMake := canMakeChange(coins, amount)
fmt.Printf("a. Apakah nominal kembalian dapat dibentuk: %v\n", canMake)
// b. Berapa jumlah minimum koin yang dapat Anda kembalikan kepada pembeli?
minCoin := minCoins(coins, amount)
fmt.Printf("b. Jumlah minimum koin: %d\n", minCoin)
// c. Berapa banyak kombinasi koin untuk membentuk nilai kembalian tersebut?
ways := countWays(coins, amount)
fmt.Printf("c. Jumlah kombinasi koin: %d\n", ways)
}