Given list of N items where each item has some [weight, value] associated with it, put the items into a knapsack of capacity W to maximize the sum of values associated with the items. Break item is not allowed.
This algorithm uses memoization to improve performance. It's same as the recursive version of 0/1 Knapsack problem, but with a special 'cache' to store results. The 'cache key' is crucial. It's how we identify and store past results. Sometimes we need one key, sometimes multiple keys. We add code to:
cache = None
def pick(ls, w):
if len(ls) <= 0 or w <= 0:
return 0
global cache
if not cache:
cache = [{} for _ in range(len(ls) + 1)]
if w not in cache[len(ls)]:
if ls[0][1] > w:
cache[len(ls)][w] = pick(ls[1:], w)
else:
cache[len(ls)][w] = max(ls[0][0] + pick(ls[1:], w - ls[0][1]), pick(ls[1:], w))
return cache[len(ls)][w]
ls = [[120, 3], [60, 1], [100, 2]]
W = 5
print(pick(ls, W))
const cache = [];
function pick(list, w) {
if (list.length <= 0 || w <= 0) {
return 0;
}
if (cache[list.length] === undefined) {
cache[list.length] = {}
}
if (cache[list.length][w] === undefined) {
if (list[0][1] > w) {
cache[list.length][w] = pick(list.slice(1), w);
} else {
cache[list.length][w] = Math.max(list[0][0] + pick(list.slice(1), w - list[0][1]), pick(list.slice(1), w));
}
}
return cache[list.length][w];
}
const list = [[120, 3], [60, 1], [100, 2]];
const W = 5;
console.log(pick(list, W));