CCCPaste

Coin Change

package main

import (
	"fmt"
	"math"
)

// Fungsi untuk menghitung jumlah minimum koin dan banyak kombinasi koin
func minCoinsAndCombinations(amount int, coins []int) (int, int) {
	// Array untuk menyimpan jumlah minimum koin untuk setiap nilai
	minCoins := make([]int, amount+1)
	for i := range minCoins {
		minCoins[i] = math.MaxInt32
	}
	minCoins[0] = 0

	// Array untuk menyimpan jumlah kombinasi untuk setiap nilai
	dp := make([]int, amount+1)
	dp[0] = 1

	for _, coin := range coins {
		for i := coin; i <= amount; i++ {
			// Perbarui minCoins untuk nilai saat ini
			if minCoins[i-coin]+1 < minCoins[i] {
				minCoins[i] = minCoins[i-coin] + 1
			}
			// Perbarui jumlah kombinasi untuk nilai saat ini
			dp[i] += dp[i-coin]
		}
	}

	return minCoins[amount], dp[amount]
}

func main() {
	// Nominal yang ingin dibentuk
	amount := 146
	// Pecahan koin yang tersedia
	coins := []int{1, 5, 10, 25, 50, 100}

	// Mendapatkan hasil
	minKoin, kombinasi := minCoinsAndCombinations(amount, coins)

	fmt.Printf("Jumlah minimum koin untuk membentuk %d: %d\n", amount, minKoin)
	fmt.Printf("Banyak kombinasi koin untuk membentuk %d: %d\n", amount, kombinasi)
}