64 lines
1.7 KiB
Plaintext
64 lines
1.7 KiB
Plaintext
global globalItems = #()
|
|
global usedMass = 0
|
|
global neededItems = #()
|
|
global totalValue = 0
|
|
struct kn_item
|
|
(
|
|
item, weight, value
|
|
)
|
|
|
|
itemStrings = #("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")
|
|
|
|
fn sortByValue a b =
|
|
(
|
|
if a[1].value > b[1].value then return -1
|
|
else
|
|
(
|
|
if a[1].value == b[1].value then return 0
|
|
else return 1
|
|
)
|
|
)
|
|
fn chooseBestItem maximumWeight: items: =
|
|
(
|
|
local itemsCopy = deepcopy items
|
|
local possibleItems = #()
|
|
for i = 1 to itemsCopy.count do
|
|
(
|
|
if itemsCopy[i].weight <= maximumWeight do append possibleItems (#(itemsCopy[i],i))
|
|
)
|
|
qsort possibleItems sortByValue
|
|
if possibleItems.count > 0 then return possibleItems[1] else return 0
|
|
)
|
|
|
|
for i = 1 to itemStrings.count do
|
|
(
|
|
local split = filterstring itemStrings[i] "#"
|
|
local itemStruct = kn_item item:split[1] weight:(split[2] as integer) \
|
|
value:(split[3] as integer)
|
|
appendifunique globalItems itemstruct
|
|
)
|
|
|
|
while usedMass < 400 do
|
|
(
|
|
local item = chooseBestItem maximumweight:(400-usedMass) items:(globalItems)
|
|
if item != 0 then
|
|
(
|
|
deleteitem globalItems (item[2])
|
|
appendifunique neededItems item[1]
|
|
usedMass += item[1].weight
|
|
) else exit
|
|
)
|
|
for i in neededitems do
|
|
(
|
|
format "Item name: %, weight: %, value:%\n" i.item i.weight i.value
|
|
totalValue += i.value
|
|
)
|
|
format "Total mass: %, Total Value: %\n" usedMass totalValue
|