The knapsack problem is a problem in combinatorial optimisation.

*Imagine you are going to visit your friends for whom you have bought lots of presents. So many, in fact, that you can’t fit them all in your luggage meaning you must leave some behind. If we decide to pack a combination of presents with the highest value but that doesn’t exceed the weight limit imposed by airline, how can we find such a combinations? *This is the **Knapsack Problem**.

We could solve this by trying all the possible combinations, calculating their value and weight and then picking one that is below the weight limit but maximises the value. Whilst this is okay when we are dealing with a small number of items, it is simply unfeasible when the number of items is large as the number of combinations is too big. So, is there an algorithm which can work for any number of items that doesn’t take too long?

Computer scientists have a way of measuring the complexity of a problem by how fast the time taken grows as the size of the input increases. Polynomial growth, i.e. if the size of the input is *n* then the time taken grows by a factor of *n^k, *describes and ‘easy problem’; the growth is nowhere near as “explosive” as exponential growth, e.g. *2^n*.

Whether or not a polynomial time algorithm exists to solve the knapsack problem is unknown, meaning it is in a class of problems called *NP-Hard Problems*.

**Complexity Classes:**

- Class P: problems that can be solved in polynomial time
- Class NP: a potential solution can be checked in polynomial time
- NP-Complete: within the NP class but particularly hard
- NP-Hard: as least as hard as the NP class.

It is possible that the NP class = P class, though this is still unknown (and is one of the Millennium Prize Problems), hence the two diagrams above.

M x

P.S. My posts may be more sporadic in the next month because I’m in exam term!