CCCPaste

Knapsack GO

package main

import (
	"fmt"
)

// Barang struct
type Barang struct {
	name   string
	value  int
	weight int
}

// Fungsi Knapsack Problem
func knapsack(items []Barang, maxCapacity int) (int, []string) {
	n := len(items)
	dp := make([][]int, n+1)
	for i := range dp {
		dp[i] = make([]int, maxCapacity+1)
	}

	// Mengisi tabel DP
	for i := 1; i <= n; i++ {
		for w := 0; w <= maxCapacity; w++ {
			if items[i-1].weight <= w {
				dp[i][w] = max(dp[i-1][w], dp[i-1][w-items[i-1].weight]+items[i-1].value)
			} else {
				dp[i][w] = dp[i-1][w]
			}
		}
	}

	// Nilai maksimum yang bisa dicapai
	maxValue := dp[n][maxCapacity]

	// Mencari barang-barang yang diambil untuk mencapai nilai maksimum
	selectedItems := []string{}
	w := maxCapacity
	for i := n; i > 0; i-- {
		if dp[i][w] != dp[i-1][w] {
			selectedItems = append(selectedItems, items[i-1].name)
			w -= items[i-1].weight
		}
	}

	return maxValue, selectedItems
}

// Fungsi untuk mencari nilai maksimum dari dua bilangan
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	// Data barang
	items := []Barang{
		{"A", 45, 7},
		{"B", 35, 5},
		{"C", 25, 2},
		{"D", 40, 5},
		{"E", 55, 10},
		{"F", 35, 3},
		{"G", 75, 6},
	}

	// Kapasitas maksimum tas
	maxCapacity := 29

	// Menyelesaikan masalah Knapsack
	maxValue, selectedItems := knapsack(items, maxCapacity)

	// Menampilkan hasil
	fmt.Printf("Nilai maksimum: %d juta rupiah\n", maxValue)
	fmt.Println("Barang-barang yang dipilih:")
	for _, item := range selectedItems {
		fmt.Println(item)
	}
}