Skip to content

Commit 8ee19d2

Browse files
committed
add solution of napsack problem with dp
1 parent 0d28a32 commit 8ee19d2

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

dynamic-programming/napsack.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// napsack Problem
2+
// https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/
3+
package napsack
4+
5+
// package main
6+
7+
import (
8+
"fmt"
9+
"math"
10+
)
11+
12+
type item struct {
13+
weight int
14+
value int
15+
}
16+
17+
func max(a, b int) int {
18+
return int(math.Max(float64(a), float64(b)))
19+
}
20+
21+
// display result of dp data structure
22+
func dist(dp [][]int) {
23+
for i := 0; i < len(dp); i++ {
24+
str := ""
25+
for j := 0; j < len(dp[i]); j++ {
26+
str = str + " " + fmt.Sprintf("%d", dp[i][j])
27+
}
28+
fmt.Println(str)
29+
}
30+
}
31+
32+
// solve napsack problem
33+
func solve(maxWeight int, items []item) [][]int {
34+
n := len(items) + 1
35+
m := maxWeight + 1
36+
// create dp data structure
37+
dp := make([][]int, n)
38+
for i := range dp {
39+
dp[i] = make([]int, m)
40+
}
41+
for i := 0; i < len(items); i++ {
42+
for j := 0; j <= maxWeight; j++ {
43+
if items[i].weight > j {
44+
dp[i+1][j] = dp[i][j]
45+
} else {
46+
dp[i+1][j] = max(dp[i][j-items[i].weight]+items[i].value, dp[i][j])
47+
}
48+
}
49+
}
50+
return dp
51+
}
52+
53+
// convert int slice into item slice
54+
func baseConv(base [][]int) []item {
55+
var items []item
56+
for i := 0; i < len(base); i++ {
57+
var tmp item
58+
tmp.weight = base[i][0]
59+
tmp.value = base[i][1]
60+
items = append(items, tmp)
61+
}
62+
return items
63+
}
64+
65+
/*
66+
func main() {
67+
maxWeight := 50
68+
base := [][]int{
69+
{10, 60},
70+
{20, 100},
71+
{30, 120},
72+
}
73+
items := baseConv(base)
74+
dp := solve(maxWeight, items)
75+
dist(dp)
76+
}
77+
*/

0 commit comments

Comments
 (0)