# Knapsack problem

The **knapsack problem** or **rucksack problem** is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible. It derives its name from the problem faced by someone who is constrained by a fixed-size knapsack and must fill it with the most valuable items.

The problem often arises in resource allocation where there are financial constraints and is studied in fields such as combinatorics, computer science, complexity theory, cryptography and applied mathematics.

The knapsack problem has been studied for more than a century, with early works dating as far back as 1897.^{[1]} The name "knapsack problem" dates back to the early works of mathematician Tobias Dantzig (1884–1956),^{[2]} and refers to the commonplace problem of packing the most valuable or useful items without overloading the luggage.

## Contents

## Applications

A 1999 study of the Stony Brook University Algorithm Repository showed that, out of 75 algorithmic problems, the knapsack problem was the 19th most popular and the third most needed after suffix trees and the bin packing problem.^{[3]}

Knapsack problems appear in real-world decision-making processes in a wide variety of fields, such as finding the least wasteful way to cut raw materials,^{[4]} selection of investments and portfolios,^{[5]} selection of assets for asset-backed securitization,^{[6]} and generating keys for the Merkle–Hellman^{[7]} and other knapsack cryptosystems.

One early application of knapsack algorithms was in the construction and scoring of tests in which the test-takers have a choice as to which questions they answer. For small examples, it is a fairly simple process to provide the test-takers with such a choice. For example, if an exam contains 12 questions each worth 10 points, the test-taker need only answer 10 questions to achieve a maximum possible score of 100 points. However, on tests with a heterogeneous distribution of point values, it is more difficult to provide choices. Feuerman and Weiss proposed a system in which students are given a heterogeneous test with a total of 125 possible points. The students are asked to answer all of the questions to the best of their abilities. Of the possible subsets of problems whose total point values add up to 100, a knapsack algorithm would determine which subset gives each student the highest possible score.^{[8]}

## Definition

The most common problem being solved is the **0-1 knapsack problem**, which restricts the number *[math]x_i[/math]* of copies of each kind of item to zero or one. Given a set of *[math]n[/math]* items numbered from 1 up to *[math]n[/math]*, each with a weight *[math]w_i[/math]* and a value *[math]v_i[/math]*, along with a maximum weight capacity *[math]W[/math]*,

- maximize [math]\sum_{i=1}^n v_i x_i[/math]
- subject to [math]\sum_{i=1}^n w_i x_i \leq W[/math] and [math]x_i \in \{0,1\}[/math].

Here *[math]x_i[/math]* represents the number of instances of item *[math]i[/math]* to include in the knapsack. Informally, the problem is to maximize the sum of the values of the items in the knapsack so that the sum of the weights is less than or equal to the knapsack's capacity.

The **bounded knapsack problem** (**BKP**) removes the restriction that there is only one of each item, but restricts the number [math]x_i[/math] of copies of each kind of item to a maximum non-negative integer value [math]c[/math]:

- maximize [math]\sum_{i=1}^n v_i x_i[/math]
- subject to [math]\sum_{i=1}^n w_i x_i \leq W[/math] and [math]0 \leq x_i \leq c[/math]

The **unbounded knapsack problem** (**UKP**) places no upper bound on the number of copies of each kind of item and can be formulated as above except for that the only restriction on [math]x_i[/math] is that it is a non-negative integer.

- maximize [math]\sum_{i=1}^n v_i x_i[/math]
- subject to [math]\sum_{i=1}^n w_i x_i \leq W[/math] and [math]x_i \geq 0[/math]

One example of the unbounded knapsack problem is given using the figure shown at the beginning of this article and the text "if any number of each box is available" in the caption of that figure.

## Computational complexity

The knapsack problem is interesting from the perspective of computer science for many reasons:

- The decision problem form of the knapsack problem (
*Can a value of at least*V*be achieved without exceeding the weight*W*?*) is NP-complete, thus there is no known algorithm both correct and fast (polynomial-time) in all cases. - While the decision problem is NP-complete, the optimization problem is NP-hard, its resolution is at least as difficult as the decision problem, and there is no known polynomial algorithm which can tell, given a solution, whether it is optimal (which would mean that there is no solution with a larger
*V*, thus solving the NP-complete decision problem). - There is a pseudo-polynomial time algorithm using dynamic programming.
- There is a fully polynomial-time approximation scheme, which uses the pseudo-polynomial time algorithm as a subroutine, described below.
- Many cases that arise in practice, and "random instances" from some distributions, can nonetheless be solved exactly.

There is a link between the "decision" and "optimization" problems in that if there exists a polynomial algorithm that solves the "decision" problem, then one can find the maximum value for the optimization problem in polynomial time by applying this algorithm iteratively while increasing the value of k . On the other hand, if an algorithm finds the optimal value of the optimization problem in polynomial time, then the decision problem can be solved in polynomial time by comparing the value of the solution output by this algorithm with the value of k . Thus, both versions of the problem are of similar difficulty.

One theme in research literature is to identify what the "hard" instances of the knapsack problem look like,^{[9]}^{[10]} or viewed another way, to identify what properties of instances in practice might make them more amenable than their worst-case NP-complete behaviour suggests.^{[11]} The goal in finding these "hard" instances is for their use in public key cryptography systems, such as the Merkle-Hellman knapsack cryptosystem.

Furthermore, notable is the fact that the hardness of the knapsack problem depends on the form of the input. If the weights and profits are given as integers, it is weakly NP-complete, while it is strongly NP-complete if the weights and profits are given as rational numbers.^{[12]} However, in the case of rational weights and profits it still admits an FPTAS.

## Solving

Several algorithms are available to solve knapsack problems, based on dynamic programming approach,^{[13]} branch and bound approach^{[14]} or hybridizations of both approaches.^{[11]}^{[15]}^{[16]}^{[17]}

### Dynamic programming in-advance algorithm

The **unbounded knapsack problem** (**UKP**) places no restriction on the number of copies of each kind of item. Besides, here we assume that [math]x_i \gt 0[/math]

- [math]m[w']= \max \left( \sum_{i=1}^n v_i x_i \right)[/math]
- subject to [math]\sum_{i=1}^n w_i x_i \leq w'[/math] and [math]x_i \gt 0[/math]

Observe that [math]m[w][/math] has the following properties:

1. [math]m[0]=0\,\![/math] (the sum of zero items, i.e., the summation of the empty set).

2. [math]m[w]=\max (v_1+m[w-w_1],v_2+m[w-w_2],...,v_i+m[w-w_i])[/math] , [math]w_i \leq w[/math], where [math]v_i[/math] is the value of the [math]i[/math]-th kind of item.

The second property needs to be explained in detail. During the process of the running of this method, how do we get the weight [math]w[/math]? There are only [math]i[/math] ways and the previous weights are [math]w-w_1, w-w_2,..., w-w_i[/math] where there are total [math]i[/math] kinds of different item(by saying different, we mean that the weight and the value are not completely the same). If we know each value of these [math]i[/math] items and the related maximum value previously, we just compare them to each other and get the maximum value ultimately and we are done.

Here the maximum of the empty set is taken to be zero. Tabulating the results from [math]m[0][/math] up through [math]m[W][/math] gives the solution. Since the calculation of each [math]m[w][/math] involves examining at most [math]n[/math] items, and there are at most [math]W[/math] values of [math]m[w][/math] to calculate, the running time of the dynamic programming solution is [math]O(nW)[/math]. Dividing [math]w_1,\,w_2,\,\ldots,\,w_n,\,W[/math] by their greatest common divisor is a way to improve the running time.

Even P≠NP, the [math]O(nW)[/math] complexity does not contradict the fact that the knapsack problem is NP-complete, since [math]W[/math], unlike [math]n[/math], is not polynomial in the length of the input to the problem. The length of the [math]W[/math] input to the problem is proportional to the number of bits in [math]W[/math], [math]\log W[/math], not to [math]W[/math] itself. However, since this runtime is pseudopolynomial, this makes the (decision version of the) knapsack problem a weakly NP-complete problem.

#### 0/1 knapsack problem

A similar dynamic programming solution for the 0/1 knapsack problem also runs in pseudo-polynomial time. Assume [math]w_1,\,w_2,\,\ldots,\,w_n,\, W[/math] are strictly positive integers. Define [math]m[i,w][/math] to be the maximum value that can be attained with weight less than or equal to [math]w[/math] using items up to [math]i[/math] (first [math]i[/math] items).

We can define [math]m[i,w][/math] recursively as follows: **(Definition A)**

- [math]m[0,\,w]=0[/math]
- [math]m[i,\,w]=m[i-1,\,w][/math] if [math]w_i \gt w\,\![/math] (the new item is more than the current weight limit)
- [math]m[i,\,w]=\max(m[i-1,\,w],\,m[i-1,w-w_i]+v_i)[/math] if [math]w_i \leqslant w[/math].

The solution can then be found by calculating [math]m[n,W][/math]. To do this efficiently, we can use a table to store previous computations.

The following is pseudo code for the dynamic program:

// Input: // Values (stored in array v) // Weights (stored in array w) // Number of distinct items (n) // Knapsack capacity (W) // NOTE: The array "v" and array "w" are assumed to store all relevant values starting at index 1. for j from 0 to W do: m[0, j] := 0 for i from 1 to n do: for j from 0 to W do: if w[i] > j then: m[i, j] := m[i-1, j] else: m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])

This solution will therefore run in [math]O(nW)[/math] time and [math]O(nW)[/math] space.

However, if we take it a step or two further, we should know that the method will run in the time between [math]O(nW)[/math] and [math]O(2^n)[/math]. From **Definition A**, we can know that there is no need for computing all the weights when the number of items and the items themselves that we chose are fixed. That is to say, the program above computes more than expected because that the weight changes from 0 to W all the time. All we need to do is to compare m[i-1, j] and m[i-1, j-w[i]] + v[i] for m[i, j], and when m[i-1, j-w[i]] is out of range, we just give the value of m[i-1, j] to m[i, j]. From this perspective, we can program this method so that it runs recursively!

// Input: // Values (stored in array v) // Weights (stored in array w) // Number of distinct items (n) // Knapsack capacity (W) // NOTE: The array "v" and array "w" are assumed to store all relevant values starting at index 1. Define value[n, W] Initialize All value[i, j] = -1 Define m:=(i,j) //Define function m so that it represents the maximum value we can get under the condition: use first i items, total weight limit is j { if i = 0 or j <= 0 then: return 0 if (value[i-1,j] == -1) then: //m[i-1, j] has not been calculated, we have to call function m value[i-1,j] = m(i-1,j) if w[i] > j then: //item cannot fit in the bag (THIS WAS MISSING FROM THE PREVIOUS ALGORITHM) value[i,j] = value[i-1,j] else: if (value[i-1, j-w[i]] == -1) then: //m[i-1,j-w[i]] has not been calculated, we have to call function m value[i-1, j-w[i]] = m(i-1, j-w[i]) value[i, j] = max(value[i-1,j], value[i-1, j-w[i]] + v[i]) return value[i,j] } Run m(n,W)

For example, there are 10 different items and the weight limit is 67. So,

- [math]\begin{align} &w[ 1]= 23 ,w[ 2]= 26,w[ 3]= 20,w[ 4]= 18,w[ 5]= 32,w[ 6]= 27,w[ 7]= 29,w[ 8]= 26,w[ 9]= 30,w[ 10]= 27 \\ &v[ 1]=505 ,v[ 2]=352,v[ 3]=458,v[ 4]=220,v[ 5]=354,v[ 6]=414,v[ 7]=498,v[ 8]=545,v[ 9]=473,v[ 10]=543 \\ \end{align}[/math]

If you use above method to compute for [math]m(10,67)[/math], you will get (*excluding calls that produce m(i,j) = 0*):

- [math]\begin{align} &m(10, 67) = 1270\\ &m(9, 67) = 1270, m(9, 40) = 678\\ &m(8, 67) = 1270, m(8, 40) = 678, m(8, 37) = 545\\ &m(7, 67) = 1183, m(7, 41) = 725, m(7, 40) = 678, m(7, 37) = 505\\ &m(6, 67) = 1183, m(6, 41) = 725, m(6, 40) = 678, m(6, 38) = 678, m(6, 37) = 505\\ &m(5, 67) = 1183, m(5, 41) = 725, m(5, 40) = 678, m(5, 38) = 678, m(5, 37) = 505\\ &m(4, 67) = 1183, m(4, 41) = 725, m(4, 40) = 678, m(4, 38) = 678, m(4, 37) = 505, m(4, 35) = 505\\ &m(3, 67) = 963, m(3, 49) = 963, m(3, 41) = 505, m(3, 40) = 505, m(3, 38) = 505, m(3, 37) = 505, m(3, 35) = 505, m(3, 23) = 505, m(3, 22) = 458, m(3, 20) = 458\\ &m(2, 67) = 857, m(2, 49) = 857, m(2, 47) = 505, m(2, 41) = 505, m(2, 40) = 505, m(2, 38) = 505, m(2, 37) = 505, m(2, 35) = 505, m(2, 29) = 505, m(2, 23) = 505\\ &m(1, 67) = 505, m(1, 49) = 505, m(1, 47) = 505, m(1, 41) = 505, m(1, 40) = 505, m(1, 38) = 505, m(1, 37) = 505, m(1, 35) = 505, m(1, 29) = 505, m(1, 23) = 505\\ \end{align}[/math]

Besides, we can break the recursion and convert it into a tree. Then we can cut some leaves and use parallel computing to expedite the running of this method!

### Meet-in-the-middle

Another algorithm for 0-1 knapsack, discovered in 1974^{[18]} and sometimes called "meet-in-the-middle" due to parallels to a similarly named algorithm in cryptography, is exponential in the number of different items but may be preferable to the DP algorithm when [math]W[/math] is large compared to *n*. In particular, if the [math]w_i[/math] are nonnegative but not integers, we could still use the dynamic programming algorithm by scaling and rounding (i.e. using fixed-point arithmetic), but if the problem requires [math]d[/math] fractional digits of precision to arrive at the correct answer, [math]W[/math] will need to be scaled by [math]10^d[/math], and the DP algorithm will require [math]O(W10^d)[/math] space and [math]O(nW10^d)[/math] time.

algorithmMeet-in-the-middleisinput:A set of items with weights and values.output:The greatest combined value of a subset. partition the set {1...n} into two setsAandBof approximately equal size compute the weights and values of all subsets of each setfor eachsubsetofAdofind the subset ofBof greatest value such that the combined weight is less thanWkeep track of the greatest combined value seen so far

The algorithm takes [math]O(2^{n/2})[/math] space, and efficient implementations of step 3 (for instance, sorting the subsets of B by weight, discarding subsets of B which weigh more than other subsets of B of greater or equal value, and using binary search to find the best match) result in a runtime of [math]O(n2^{n/2})[/math]. As with the meet in the middle attack in cryptography, this improves on the [math]O(n2^n)[/math] runtime of a naive brute force approach (examining all subsets of [math]\{1...n\}[/math]), at the cost of using exponential rather than constant space (see also baby-step giant-step).

### Approximation algorithms

As for most NP-complete problems, it may be enough to find workable solutions even if they are not optimal. Preferably, however, the approximation comes with a guarantee on the difference between the value of the solution found and the value of the optimal solution.

As with many useful but computationally complex algorithms, there has been substantial research on creating and analyzing algorithms that approximate a solution. The knapsack problem, though NP-Hard, is one of a collection of algorithms that can still be approximated to any specified degree. This means that the problem has a polynomial time approximation scheme. To be exact, the knapsack problem has a fully polynomial time approximation scheme (FPTAS).^{[19]}

#### Greedy approximation algorithm

George Dantzig proposed a greedy approximation algorithm to solve the unbounded knapsack problem.^{[20]} His version sorts the items in decreasing order of value per unit of weight, [math]v_i/w_i[/math]. It then proceeds to insert them into the sack, starting with as many copies as possible of the first kind of item until there is no longer space in the sack for more. Provided that there is an unlimited supply of each kind of item, if [math]m[/math] is the maximum value of items that fit into the sack, then the greedy algorithm is guaranteed to achieve at least a value of [math]m/2[/math]. However, for the bounded problem, where the supply of each kind of item is limited, the algorithm may be far from optimal.

#### Fully polynomial time approximation scheme

The fully polynomial time approximation scheme (FPTAS) for the knapsack problem takes advantage of the fact that the reason the problem has no known polynomial time solutions is because the profits associated with the items are not restricted. If one rounds off some of the least significant digits of the profit values then they will be bounded by a polynomial and 1/ε where ε is a bound on the correctness of the solution. This restriction then means that an algorithm can find a solution in polynomial time that is correct within a factor of (1-ε) of the optimal solution.^{[19]}

algorithmFPTASisinput:ε ∈ (0,1] a list A of n items, specified by their values, [math]v_i[/math], and weightsoutput:S' the FPTAS solution P := max [math]\{v_i\mid 1 \leq i \leq n\} [/math] // the highest item value K := ε [math]\frac{P}{n}[/math]forifrom1tondo[math]v'_i[/math] := [math]\left\lfloor \frac{v_i}{K} \right\rfloor[/math]end forreturnthe solution, S', using the [math]v'_i[/math] values in the dynamic program outlined above

**Theorem:** The set [math]S'[/math] computed by the algorithm above satisfies [math]\mathrm{profit}(S') \geq (1-\varepsilon) \cdot \mathrm{profit}(S^*)[/math], where [math]S^*[/math] is an optimal solution.

### Dominance relations

Solving the unbounded knapsack problem can be made easier by throwing away items which will never be needed. For a given item [math]i[/math], suppose we could find a set of items [math]J[/math] such that their total weight is less than the weight of [math]i[/math], and their total value is greater than the value of [math]i[/math]. Then [math]i[/math] cannot appear in the optimal solution, because we could always improve any potential solution containing [math]i[/math] by replacing [math]i[/math] with the set [math]J[/math]. Therefore, we can disregard the [math]i[/math]-th item altogether. In such cases, [math]J[/math] is said to **dominate** [math]i[/math]. (Note that this does not apply to bounded knapsack problems, since we may have already used up the items in [math]J[/math].)

Finding dominance relations allows us to significantly reduce the size of the search space. There are several different types of dominance relations,^{[11]} which all satisfy an inequality of the form:

[math]\qquad \sum_{j \in J} w_j\,x_j \ \le \alpha\,w_i[/math], and [math]\sum_{j \in J} v_j\,x_j \ \ge \alpha\,v_i\,[/math] for some [math]x \in Z _+^n [/math]

where [math]\alpha\in Z_+ \,,J\subsetneq N[/math] and [math]i\not\in J[/math]. The vector [math]x[/math] denotes the number of copies of each member of [math]J[/math].

- Collective dominance
- The [math]i[/math]-th item is
**collectively dominated**by [math]J[/math], written as [math]i\ll J[/math], if the total weight of some combination of items in [math]J[/math] is less than*w*and their total value is greater than_{i}*v*. Formally, [math]\sum_{j \in J} w_j\,x_j \ \le w_i[/math] and [math]\sum_{j \in J} v_j\,x_j \ \ge v_i[/math] for some [math]x \in Z _+^n [/math], i.e. [math]\alpha=1[/math]. Verifying this dominance is computationally hard, so it can only be used with a dynamic programming approach. In fact, this is equivalent to solving a smaller knapsack decision problem where [math]V = v_i[/math], [math]W = w_i[/math], and the items are restricted to [math]J[/math]._{i} - Threshold dominance
- The [math]i[/math]-th item is
**threshold dominated**by [math]J[/math], written as [math]i\prec\prec J[/math], if some number of copies of [math]i[/math] are dominated by [math]J[/math]. Formally, [math]\sum_{j \in J} w_j\,x_j \ \le \alpha\,w_i[/math], and [math]\sum_{j \in J} v_j\,x_j \ \ge \alpha\,v_i\,[/math] for some [math]x \in Z _+^n [/math] and [math]\alpha\geq 1[/math]. This is a generalization of collective dominance, first introduced in^{[13]}and used in the EDUK algorithm. The smallest such [math]\alpha[/math] defines the**threshold**of the item [math]i[/math], written [math]t_i =(\alpha-1)w_i[/math]. In this case, the optimal solution could contain at most [math]\alpha-1[/math] copies of [math]i[/math]. - Multiple dominance
- The [math]i[/math]-th item is
**multiply dominated**by a single item [math]j[/math], written as [math]i\ll_{m} j[/math], if [math]i[/math] is dominated by some number of copies of [math]j[/math]. Formally, [math]w_j\,x_j \ \le w_i[/math], and [math]v_j\,x_j \ \ge v_i[/math] for some [math]x_j \in Z _+ [/math] i.e. [math] J=\{j\}, \alpha=1, x_j=\lfloor \frac{w_i}{w_j}\rfloor[/math]. This dominance could be efficiently used during preprocessing because it can be detected relatively easily. - Modular dominance
- Let [math]b[/math] be the
*best item*, i.e. [math]\frac{v_b}{w_b}\ge\frac{v_i}{w_i}\, [/math] for all [math]i[/math]. This is the item with the greatest density of value. The [math]i[/math]-th item is**modularly dominated**by a single item [math]j[/math], written as [math]i\ll_\equiv j[/math], if [math]i[/math] is dominated by [math]j[/math] plus several copies of [math]b[/math]. Formally, [math] w_j+tw_b \le w_i[/math], and [math]v_j +tv_b \ge v_i [/math] i.e. [math]J=\{b,j\}, \alpha=1, x_b=t, x_j=1[/math].

## Variations

There are many variations of the knapsack problem that have arisen from the vast number of applications of the basic problem. The main variations occur by changing the number of some problem parameter such as the number of items, number of objectives, or even the number of knapsacks.

### Multi-objective knapsack problem

This variation changes the goal of the individual filling the knapsack. Instead of one objective, such as maximizing the monetary profit, the objective could have several dimensions. For example, there could be environmental or social concerns as well as economic goals. Problems frequently addressed include portfolio and transportation logistics optimizations.^{[21]}^{[22]}

As an example, suppose you ran a cruise ship. You have to decide how many famous comedians to hire. This boat can handle no more than one ton of passengers and the entertainers must weigh less than 1000 lbs. Each comedian has a weight, brings in business based on their popularity and asks for a specific salary. In this example, you have multiple objectives. You want, of course, to maximize the popularity of your entertainers while minimizing their salaries. Also, you want to have as many entertainers as possible.

### Multi-dimensional knapsack problem

In this variation, the weight of knapsack item [math]i[/math] is given by a D-dimensional vector [math]\overline{w_i}=(w_{i1},\ldots,w_{iD})[/math] and the knapsack has a D-dimensional capacity vector [math](W_1,\ldots,W_D)[/math]. The target is to maximize the sum of the values of the items in the knapsack so that the sum of weights in each dimension [math]d[/math] does not exceed [math]W_d[/math].

Multi-dimensional knapsack is computationally harder than knapsack; even for [math]D=2[/math], the problem does not have EPTAS unless P[math]=[/math]NP.^{[23]} However, the algorithm in^{[24]} is shown to solve sparse instances efficiently. An instance of multi-dimensional knapsack is sparse if there is a set [math]J=\{1,2,\ldots,m\}[/math] for [math]m\lt D[/math] such that for every knapsack item [math]i[/math], [math] \exists z\gt m[/math] such that [math]\forall j\in J\cup \{z\},\ w_{ij}\geq 0[/math] and [math]\forall y\notin J\cup\{z\}, w_{iy}=0[/math]. Such instances occur, for example, when scheduling packets in a wireless network with relay nodes.^{[24]} The algorithm from^{[24]} also solves sparse instances of the multiple choice variant, multiple-choice multi-dimensional knapsack.

The IHS (Increasing Height Shelf) algorithm is optimal for 2D knapsack (packing squares into a two-dimensional unit size square): when there are at most five square in an optimal packing.^{[25]}

### Multiple knapsack problem

This variation is similar to the Bin Packing Problem. It differs from the Bin Packing Problem in that a subset of items can be selected, whereas, in the Bin Packing Problem, all items have to be packed to certain bins. The concept is that there are multiple knapsacks. This may seem like a trivial change, but it is not equivalent to adding to the capacity of the initial knapsack. This variation is used in many loading and scheduling problems in Operations Research and has a Polynomial-time approximation scheme.^{[26]}

### Quadratic knapsack problem

As described by Wu et al.:

The quadratic knapsack problem (QKP) maximizes a quadratic objective function subject to a binary and linear capacity constraint.

^{[27]}

The quadratic knapsack problem was discussed under that title by Gallo, Hammer, and Simeone in 1980.^{[28]} However, Gallo and Simeone^{[29]} attribute the first treatment of the problem to Witzgall^{[30]} in 1975.

### Subset-sum problem

The subset sum problem is a special case of the decision and **0-1** problems where each kind of item, the weight equals the value: [math]w_i=v_i[/math]. In the field of cryptography, the term *knapsack problem* is often used to refer specifically to the subset sum problem and is commonly known as one of Karp's 21 NP-complete problems.^{[31]}

The generalization of subset sum problem is called multiple subset-sum problem, in which multiple bins exist with the same capacity. It has been shown that the generalization does not have an FPTAS.^{[32]}

## In popular culture

- Neal Stephenson provides an example of the knapsack problem in chapter 70 of his novel
*Cryptonomicon*to distribute family heirlooms. - The knapsack problem occurs commonly in role-playing games, both digital and paper-based (prominent examples include
*The Elder Scrolls*series and the*Dungeons and Dragons*game, respectively), where the player character is constrained by their encumbrance threshold when carrying items and treasure, which regularly forces the player to evaluate the items' value-to-weight ratio in order to bring only the most value-dense items to a merchant. - Web comic xkcd #287 - NP-Complete
- In Charles Stross'
*Accelerando*, the main character Manfred refers to the 'blind knapsack problem' in chapter 2, presumably a generalization or more complex version of the regular knapsack problem.

## See also

- Change-making problem
- Combinatorial auction
- Combinatorial optimization
- Continuous knapsack problem
- Cutting stock problem
- List of knapsack problems
- Packing problem

## Notes

- ↑ Mathews, G. B. (25 June 1897). "On the partition of numbers".
*Proceedings of the London Mathematical Society***28**: 486–490. doi:10.1112/plms/s1-28.1.486. http://plms.oxfordjournals.org/content/s1-28/1/486.full.pdf. - ↑ Dantzig, Tobias. Numbers: The Language of Science, 1930.
- ↑ Skiena, S. S. (September 1999). "Who is Interested in Algorithms and Why? Lessons from the Stony Brook Algorithm Repository".
*ACM SIGACT News***30**(3): 65–74. doi:10.1145/333623.333627. ISSN 0163-5700. - ↑ Kellerer, Pferschy, and Pisinger 2004, p. 449
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 461
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 465
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 472
- ↑ Feuerman, Martin; Weiss, Harvey (April 1973). "A Mathematical Programming Model for Test Construction and Scoring".
*Management Science***19**(8): 961–966. doi:10.1287/mnsc.19.8.961. - ↑ Pisinger, D. 2003. Where are the hard knapsack problems? Technical Report 2003/08, Department of Computer Science, University of Copenhagen, Copenhagen, Denmark.
- ↑ Caccetta, L.; Kulanoot, A. (2001). "Computational Aspects of Hard Knapsack Problems".
*Nonlinear Analysis***47**(8): 5547–5558. doi:10.1016/s0362-546x(01)00658-7. - ↑
^{11.0}^{11.1}^{11.2}Poirriez, Vincent; Yanev, Nicola; Andonov, Rumen (2009). "A hybrid algorithm for the unbounded knapsack problem".*Discrete Optimization***6**(1): 110–124. doi:10.1016/j.disopt.2008.09.004. ISSN 1572-5286. - ↑ Wojtczak, Dominik (2018). "On Strong NP-Completeness of Rational Problems".
*International Computer Science Symposium in Russia*: 308–320. doi:10.1007/978-3-319-90530-3_26. - ↑
^{13.0}^{13.1}Andonov, Rumen; Poirriez, Vincent; Rajopadhye, Sanjay (2000). "Unbounded Knapsack Problem : dynamic programming revisited".*European Journal of Operational Research***123**(2): 168–181. doi:10.1016/S0377-2217(99)00265-9. http://www.univ-valenciennes.fr/limav/poirriez/pub/rech/PI-1152.ps.gz. - ↑ S. Martello, P. Toth, Knapsack Problems: Algorithms and Computer Implementations, John Wiley and Sons, 1990
- ↑ S. Martello, D. Pisinger, P. Toth, Dynamic programming and strong bounds for the 0-1 knapsack problem,
*Manag. Sci.*, 45:414–424, 1999. - ↑ Plateau, G.; Elkihel, M. (1985). "A hybrid algorithm for the 0-1 knapsack problem".
*Methods of Oper. Res.***49**: 277–293. - ↑ Martello, S.; Toth, P. (1984). "A mixture of dynamic programming and branch-and-bound for the subset-sum problem".
*Manag. Sci.***30**(6): 765–771. doi:10.1287/mnsc.30.6.765. - ↑ Horowitz, Ellis (1974), "Computing partitions with applications to the knapsack problem",
*Journal of the Association for Computing Machinery***21**(2): 277–292, doi:10.1145/321812.321823 - ↑
^{19.0}^{19.1}Vazirani, Vijay. Approximation Algorithms. Springer-Verlag Berlin Heidelberg, 2003. - ↑ Dantzig, George B. (1957). "Discrete-Variable Extremum Problems".
*Operations Research***5**(2): 266–288. doi:10.1287/opre.5.2.266. - ↑ Chang, T. J., et al. Heuristics for Cardinality Constrained Portfolio Optimization. Technical Report, London SW7 2AZ, England: The Management School, Imperial College, May 1998
- ↑ Chang, C. S., et al. "Genetic Algorithm Based Bicriterion Optimization for Traction Substations in DC Railway System." In Fogel [102], 11-16.
- ↑ Kulik, A.; Shachnai, H. (2010). "There is no EPTAS for two dimensional knapsack".
*Inf. Process. Lett.***110**(16): 707–710. doi:10.1016/j.ipl.2010.05.031. https://www.cs.technion.ac.il/~hadas/PUB/multi_knap.pdf. - ↑
^{24.0}^{24.1}^{24.2}Cohen, R. and Grebla, G. 2014. "Multi-Dimensional OFDMA Scheduling in a Wireless Network with Relay Nodes". in*Proc. IEEE INFOCOM’14*, 2427–2435. - ↑ Yan Lan, György Dósa, Xin Han, Chenyang Zhou, Attila Benkő [1]:
*2D knapsack: Packing squares*, Theoretical Computer Science Vol. 508, pp. 35–40. - ↑ Chandra Chekuri and Sanjeev Khanna (2005). "A PTAS for the multiple knapsack problem".
*SIAM Journal on Computing***35**(3): 713–728. doi:10.1137/s0097539700382820. - ↑ Wu, Z. Y.; Yang, Y. J.; Bai, F. S.; Mammadov, M. (2011). "Global Optimality Conditions and Optimization Methods for Quadratic Knapsack Problems".
*J Optim Theory Appl***151**(2): 241–259. doi:10.1007/s10957-011-9885-4. - ↑ Gallo, G.; Hammer, P. L.; Simeone, B. (1980).
*Quadratic knapsack problems*.**12**. 132–149. doi:10.1007/BFb0120892. ISBN 978-3-642-00801-6. - ↑ Gallo, G.; Simeone, B. (1988). "On the Supermodular Knapsack Problem".
*Mathematical Programming Studies***45**(1–3): 295–309. doi:10.1007/bf01589108. - ↑ Witzgall, C. (1975).
*Mathematical methods of site selection for Electronic Message Systems (EMS)*. NBS Internal report. http://adsabs.harvard.edu/abs/1975STIN...7618321W. - ↑ Richard M. Karp (1972). "Reducibility Among Combinatorial Problems". In R. E. Miller and J. W. Thatcher (editors). Complexity of Computer Computations. New York: Plenum. pp. 85–103
- ↑ Caprara, Alberto; Kellerer, Hans; Pferschy, Ulrich (2000). "The Multiple Subset Sum Problem".
*SIAM J. Optim.***11**(2): 308–319. doi:10.1137/S1052623498348481. http://www.or.deis.unibo.it/alberto/mssp_siam.ps.

## References

- Garey, Michael R.; David S. Johnson (1979).
*Computers and Intractability: A Guide to the Theory of NP-Completeness*. W.H. Freeman. ISBN 978-0-7167-1045-5. A6: MP9, pg.247. - Kellerer, Hans; Pferschy, Ulrich; Pisinger, David (2004).
*Knapsack Problems*. Springer. doi:10.1007/978-3-540-24777-7. ISBN 978-3-540-40286-2. - Martello, Silvano; Toth, Paolo (1990).
*Knapsack problems: Algorithms and computer implementations*. Wiley-Interscience. ISBN 978-0-471-92420-3. https://archive.org/details/knapsackproblems0000mart.

## External links

- Free download of the book "Knapsack problems: Algorithms and computer implementations", by Silvano Martello and Paolo Toth
- Lecture slides on the knapsack problem
- PYAsUKP: Yet Another solver for the Unbounded Knapsack Problem, with code taking advantage of the dominance relations in an hybrid algorithm, benchmarks and downloadable copies of some papers.
- Home page of David Pisinger with downloadable copies of some papers on the publication list (including "Where are the hard knapsack problems?")
- Knapsack Problem solutions in many languages at Rosetta Code
- Dynamic Programming algorithm to 0/1 Knapsack problem
- Knapsack Problem solver (online)
- Solving 0-1-KNAPSACK with Genetic Algorithms in Ruby
- Codes for Quadratic Knapsack Problem
- Optimizing Three-Dimensional Bin Packing
- Knapsack Integer Programming Solution in Python Gekko (optimization software)

*https://en.wikipedia.org/wiki/Knapsack problem was the original source. Read more*.