How to resolve the algorithm Knapsack problem/0-1 step by step in the Tcl programming language
How to resolve the algorithm Knapsack problem/0-1 step by step in the Tcl programming language
Table of Contents
Problem Statement
A tourist wants to make a good trip at the weekend with his friends. They will go to the mountains to see the wonders of nature, so he needs to pack well for the trip. He has a good knapsack for carrying things, but knows that he can carry a maximum of only 4kg in it, and it will have to last the whole day. He creates a list of what he wants to bring for the trip but the total weight of all items is too much. He then decides to add columns to his initial list detailing their weights and a numerical value representing how important the item is for the trip.
Here is the list:
The tourist can choose to take any combination of items from the list, but only one of each item is available. He may not cut or diminish the items, so he can only take whole units of any item.
Show which items the tourist can carry in his knapsack so that their total weight does not exceed 400 dag [4 kg], and their total value is maximized. [dag = decagram = 10 grams]
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Knapsack problem/0-1 step by step in the Tcl programming language
Source code in the tcl programming language
# The list of items to consider, as list of lists
set items {
{map 9 150}
{compass 13 35}
{water 153 200}
{sandwich 50 160}
{glucose 15 60}
{tin 68 45}
{banana 27 60}
{apple 39 40}
{cheese 23 30}
{beer 52 10}
{{suntan cream} 11 70}
{camera 32 30}
{t-shirt 24 15}
{trousers 48 10}
{umbrella 73 40}
{{waterproof trousers} 42 70}
{{waterproof overclothes} 43 75}
{note-case 22 80}
{sunglasses 7 20}
{towel 18 12}
{socks 4 50}
{book 30 10}
}
# Simple extraction functions
proc names {chosen} {
set names {}
foreach item $chosen {lappend names [lindex $item 0]}
return $names
}
proc weight {chosen} {
set weight 0
foreach item $chosen {incr weight [lindex $item 1]}
return $weight
}
proc value {chosen} {
set value 0
foreach item $chosen {incr value [lindex $item 2]}
return $value
}
# Recursive function for searching over all possible choices of items
proc knapsackSearch {items {chosen {}}} {
# If we've gone over the weight limit, stop now
if {[weight $chosen] > 400} {
return
}
# If we've considered all of the items (i.e., leaf in search tree)
# then see if we've got a new best choice.
if {[llength $items] == 0} {
global best max
set v [value $chosen]
if {$v > $max} {
set max $v
set best $chosen
}
return
}
# Branch, so recurse for chosing the current item or not
set this [lindex $items 0]
set rest [lrange $items 1 end]
knapsackSearch $rest $chosen
knapsackSearch $rest [lappend chosen $this]
}
# Initialize a few global variables
set best {}
set max 0
# Do the brute-force search
knapsackSearch $items
# Pretty-print the results
puts "Best filling has weight of [expr {[weight $best]/100.0}]kg and score [value $best]"
puts "Best items:\n\t[join [lsort [names $best]] \n\t]"
You may also check:How to resolve the algorithm De Bruijn sequences step by step in the 8086 Assembly programming language
You may also check:How to resolve the algorithm Sort disjoint sublist step by step in the ooRexx programming language
You may also check:How to resolve the algorithm Abbreviations, automatic step by step in the Mathematica/Wolfram Language programming language
You may also check:How to resolve the algorithm Idiomatically determine all the characters that can be used for symbols step by step in the Go programming language
You may also check:How to resolve the algorithm Sequence: smallest number with exactly n divisors step by step in the Maple programming language