假设你是一个小偷,背着一个可装下 4 磅东西的背包,你可以偷窃的物品如下:
为了让偷窃的商品价值最高,你该选择哪些商品?
简单算法
最简单的算法是:尝试各种可能的商品组合,并找出价值最高的组合。
这样显然是可行的,但是速度非常慢。在只有 3 件商品的情况下,你需要计算 8 个不同的集合;当有 4 件商品的时候,你需要计算 16 个不同的集合。每增加一件商品,需要计算的集合数都将翻倍!这种算法的运行时间是 O(2ⁿ),真的是慢如蜗牛。
动态规划
解决这样问题的答案就是使用动态规划!下面来看看动态规划的工作原理。动态规划先解决子问题,再逐步解决大问题。
对于背包问题,你先解决小背包(子背包)问题,再逐步解决原来的问题。
比较有趣的一句话是:每个动态规划都从一个网格开始。
背包问题的网格如下: