Dynamic Programming
optimization and pseudo-polynomial