Dynamic Programming
动态规划(DP)初探
DP的思想是:将一个大问题的求解转化为一些更小问题的求解。我们假设对于一个更小的问题已经有了最优解答,在此基础上我们build up the bigger problems。这种分而治之的思想非常像递归,但是递归通常会招致不必要的算力消耗,因此 DP使用了 bottom up的方法,有效地节省了算力。
DP guarantees to find the best solution
(Basic principles: 1. Divide and Conquer; 2. Bottom Up computation)
当我们谈起DP,其实可以预设一个很大的 table,我们要做的事情其实就是填表。
Take knapsack as an example
这里还是以 knapsack problem为例,假设问题如下:
给定一个 Capacity为 k的 knapsack,给定一组物品并用 1,2,…,n标记,物品i的价值为 v i v_i vi,重量为 w i w_i wi. $ I = {1,2,…,n }$.
希望找到一个最优选择,使得在 knapsack可以装下的情况下,拿走物品的总价值最大。
我们可以建模如下:
max ∑ i ∈ I v i x i s . t . ∑ i ∈ I v i x i ≤ k x i ∈ { 0 , 1 } , i ∈ I \max \sum_{i\in I}v_i x_i\\ s.t. \sum_{i\in I}v_i x_i \le k \\ x_i \in \{0,1\}, i\in I maxi∈I∑vixis.t.i∈I∑