Knapsack problem/0-1: Difference between revisions

Content added Content deleted
(Realize in MiniZinc)
Line 6,287: Line 6,287:
best total knapsack value───────── 1,030
best total knapsack value───────── 1,030
best total knapsack items───────── 12
best total knapsack items───────── 12
</pre>

=={{header|Ring}}==
<lang ring>
# Project : Knapsack problem/0-1

knap = [["map",9,150],
["compass",13,35],
["water",153,20],
["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]]
knapsack = createDimList([pow(2, len(knap)),len(knap)+2])
lenknap = list(pow(2, len(knap)))

sacksize = 400
powerset(knap)

for n = 1 to pow(2, len(knap))-2
for m = n + 1 to pow(2, len(knap))-1
if knapsack[m][lenknap[m]-1] <= sacksize and
knapsack[m][lenknap[m]] > knapsack[n][lenknap[n]]
temp = knapsack[n]
lentemp = lenknap[n]
knapsack[n] = knapsack[m]
knapsack[n+1] = temp
lenknap[n] = lenknap[m]
lenknap[n+1] = lentemp
ok
next
next

for n = 1 to lenknap[1] - 2
see knapsack[1][n] + nl
next

see "Total weight = " + knapsack[1][lenknap[1]-1] + nl
see "Total value = " + knapsack[1][lenknap[1]] + nl

func powerset(list)
n1 = 0
for i = 2 to (2 << len(list)) - 1 step 2
n2 = 0
n1 = n1 + 1
weight = 0
value = 0
for j = 1 to len(list)
if i & (1 << j)
n2 = n2 + 1
knapsack[n1][n2] = list[j][1]
weight = weight + list[j][2]
value = value + list[j][3]
knapsack[n1][n2+1] = weight
knapsack[n1][n2+2] = value
ok
next
lenknap[n1] = n2+2
next

func createDimList(dimArray)
sizeList = len(dimArray)
newParms = []
for i = 2 to sizeList
Add(newParms, dimArray[i])
next
alist = list(dimArray[1])
if sizeList = 1
return aList
ok
for t in alist
t = createDimList(newParms)
next
return alist
</lang>
Output:
<pre>
map
compass
water
sandwich
glucose
banana
suntan cream
waterproof trousers
waterproof overclothes
note-case
sunglasses
socks

Total weight = 396
Total value = 1030
</pre>
</pre>