From 34f5c5938718139bd2601b8d3ac26eaf0cce24e9 Mon Sep 17 00:00:00 2001 From: Himanshu Shekhar Date: Sun, 1 Oct 2017 23:20:57 +0530 Subject: [PATCH] add rod cutting problem --- dynamic-programming/rod-cutting.go | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 dynamic-programming/rod-cutting.go diff --git a/dynamic-programming/rod-cutting.go b/dynamic-programming/rod-cutting.go new file mode 100644 index 000000000..8abc4e441 --- /dev/null +++ b/dynamic-programming/rod-cutting.go @@ -0,0 +1,60 @@ +// Solution to Rod cutting problem +// https://en.wikipedia.org/wiki/Cutting_stock_problem +// http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/ + +package dpRodCutting + +// package main + +import "fmt" + +func max(a, b int) int { + if a > b { + return a + } else { + return b + } + +} + +// solve the problem recursively: initial approach +func cutRodRec(price []int, length int) int { + if length == 0 { + return 0 + } + + q := -1 + for i := 1; i <= length; i++ { + q = max(q, price[i]+cutRodRec(price, length-i)) + } + return q +} + +// solve the same problem using dynamic programming +func cutRodDp(price []int, length int) int { + r := make([]int, length+1) // a.k.a the memoization array + r[0] = 0 // cost of 0 length rod is 0 + + for j := 1; j <= length; j++ { // for each length (subproblem) + q := -1 + for i := 1; i <= j; i++ { + q = max(q, price[i]+r[j-i]) // avoiding recursive call + } + r[j] = q + } + + return r[length] +} + +/* +func main() { + length := 10 + price := []int{0, 1, 5, 8, 9, 17, 17, 17, 20, 24, 30} + // price := []int{0, 10, 5, 8, 9, 17, 17, 17, 20, 24, 30} + + // fmt.Print(price[5]+price[length-5], "\n") + + fmt.Print(cutRodRec(price, length), "\n") + fmt.Print(cutRodDp(price, length), "\n") +} +*/