Program Explanation
The 0/1 Knapsack Problem is a classic optimization problem where we need to maximize the total value
of items in a knapsack without exceeding its weight capacity. Each item can either be included (1)
or excluded (0) from the knapsack. This program uses dynamic programming to find the optimal solution
efficiently by building up a table that stores the maximum values for different capacities and item combinations.
Program Structure
- Function Definition: The main function is
knapsack(capacity int, weights []int, values []int) int
,
which takes the maximum capacity of the knapsack, an array of item weights, and an array of item values. - Dynamic Programming Table: A 2D slice
dp
is created to store the maximum value
obtainable for different capacities and items. - Logic: Nested loops iterate through the items and capacities:
- If the current item’s weight is less than or equal to the current capacity, the program checks
whether including the item would yield a higher value than excluding it. - If the item’s weight exceeds the current capacity, it is excluded from consideration.
- If the current item’s weight is less than or equal to the current capacity, the program checks
- Result: The maximum value obtainable is found in the bottom-right cell of the DP table.
Go Code
package main
import (
"fmt"
)
// knapsack solves the 0/1 knapsack problem using dynamic programming.
func knapsack(capacity int, weights []int, values []int) int {
n := len(weights)
// Create a DP table to store maximum values
dp := make([][]int, n+1)
for i := range dp {
dp[i] = make([]int, capacity+1)
}
// Fill the DP table
for i := 1; i <= n; i++ {
for w := 0; w <= capacity; w++ {
if weights[i-1] <= w { dp[i][w] = max(dp[i-1][w], dp[i-1][w-weights[i-1]] + values[i-1]) } else { dp[i][w] = dp[i-1][w] } } } // The maximum value is in dp[n][capacity] return dp[n][capacity] } // max returns the maximum of two integers. func max(a, b int) int { if a > b {
return a
}
return b
}
func main() {
// Example weights and values
weights := []int{1, 2, 3}
values := []int{10, 15, 40}
capacity := 6
maxValue := knapsack(capacity, weights, values)
fmt.Printf("Maximum value in knapsack: %d\n", maxValue)
}
Explanation of the Code:
- Function
knapsack(capacity int, weights []int, values []int) int
:- This function implements the 0/1 knapsack problem using dynamic programming.
- It initializes a 2D slice
dp
, wheredp[i][w]
holds the maximum value that can be achieved with the firsti
items and a knapsack capacity ofw
.
- Dynamic Programming Table (
dp
):- The dimensions of the
dp
table are(n+1) x (capacity+1)
, wheren
is the number of items. - Each cell is filled based on whether including the current item leads to a higher value than excluding it.
- The dimensions of the
- Logic for Filling the DP Table:
- If the current item’s weight (
weights[i-1]
) is less than or equal to the current capacity (w
), the maximum value is computed as the maximum of either excluding the item (dp[i-1][w]
) or including it (dp[i-1][w-weights[i-1]] + values[i-1]
). - If the item’s weight exceeds the current capacity, the program simply carries forward the value from the previous row.
- If the current item’s weight (
- Function
max(a, b int) int
:- A utility function that returns the maximum of two integers.
How to Run the Program:
- Save the code as
main.go
. - Open your terminal and navigate to the directory containing the file.
- Run the command
go run main.go
.
This program effectively demonstrates the solution to the 0/1 knapsack problem using dynamic programming, providing a clear and efficient method to tackle this classic optimization problem.
Conclusion
This Go program efficiently solves the 0/1 knapsack problem using a dynamic programming approach.
The algorithm has a time complexity of O(n * capacity), where n is the number of items. This method is
optimal for solving the knapsack problem, allowing for easy adjustments to weights, values, and capacity.