RosettaCodeData/Task/Knapsack-problem-Bounded/Bracmat/knapsack-problem-bounded.br...

75 lines
1.5 KiB
Plaintext

(knapsack=
( things
= (map.9.150.1)
(compass.13.35.1)
(water.153.200.2)
(sandwich.50.60.2)
(glucose.15.60.2)
(tin.68.45.3)
(banana.27.60.3)
(apple.39.40.3)
(cheese.23.30.1)
(beer.52.10.3)
(suntan cream.11.70.1)
(camera.32.30.1)
(T-shirt.24.15.2)
(trousers.48.10.2)
(umbrella.73.40.1)
(waterproof trousers.42.70.1)
(waterproof overclothes.43.75.1)
(note-case.22.80.1)
(sunglasses.7.20.1)
(towel.18.12.2)
(socks.4.50.1)
(book.30.10.2)
)
& 0:?maxvalue
& :?sack
& ( add
= cumwght
cumvalue
cumsack
name
wght
val
pcs
tings
n
ncumwght
ncumvalue
. !arg
: ( ?cumwght
. ?cumvalue
. ?cumsack
. (?name.?wght.?val.?pcs) ?tings
)
& -1:?n
& whl
' ( 1+!n:~>!pcs:?n
& !cumwght+!n*!wght:~>400:?ncumwght
& !cumvalue+!n*!val:?ncumvalue
& ( !tings:
& ( !ncumvalue:>!maxvalue:?maxvalue
& !cumsack
( !n:0&
| (!n.!name)
)
: ?sack
|
)
| add
$ ( !ncumwght
. !ncumvalue
. !cumsack
(!n:0&|(!n.!name))
. !tings
)
)
)
)
& add$(0.0..!things)
& out$(!maxvalue.!sack)
);
!knapsack;