/** Solver for the Rosetta Code problem "Knapsack problem/Bounded" https://rosettacode.org/wiki/Knapsack_problem/Bounded */ use knapsack.frink // Item name, weight, value, piece(s) i = [ ["map", 9, 150, 1], ["compass", 13, 35, 1], ["water", 153, 200, 3], ["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]] [maxvalue, maxweight, usedDict] = knapsackBounded[i.getColumn[2], // value i.getColumn[1], // weight i.getColumn[3], // count 400] res = new array for ind = sort[keys[usedDict]] res.push[ [" ", i@ind@0 , ":", usedDict@ind] ] println["Items:"] println[formatTable[res, "right"]] println[] println["Total weight: $maxweight"] println["Total value: $maxvalue"]