The term knapsack refers to problems where a set of objects is given, and subsets with some properties have to be found. Knapsack problems can often be solved using dynamic programming.
Bottom-Up Knapsack (Iterative) in O(n2)
How to think of the problem
Think of it like a bag of coins, where each coin has a weight, but each coin also has value (1,2, etc). You want to maximize the bag’s value while staying within the constraints of the weight.
The issue is that arrays are generally 0-indexed if they already give it to you, which makes it kind of annoying
more generally
I find that 1-indexed is easier, due to setting up the base case at i==0.
1-indexed solution
Forward solve (TODO: Check if this implementation is correct), wt is 0-indexed
0-indexed
The example above uses 0-indexing. If you use 1=indexing, you should use wt[i] instead of wt[i-1], and val[i] instead of val[i-1]
Optimized space. We need to go from W...0 because else the weights are going to be in different sizes.
Other Example
Given a list of weights [w1,w2,...,wn], determine all sums that can be constructed using the weights.
We can recursively calculate this using the recurrence
dp(x,k)=dp(x−wk,k−1)∨dp(x,k−1)
However, here is a better implementation that only uses a one-dimensional array possible[x] that indicates whether we can construct a subset with sum x.
The trick is to update the array from right to left for each new weight: