动态规划之背包问题

动态规划问题:为了求解全局最优的解,将一个问题可以分解为多个子问题,且子问题间相关关联和递归,通过求解子问题的最优解,可以递归求得全局最优解。

01背包问题:

核心思想:

  1. 比如总重量为10,物品的重量都是整数。可以分解为0,1,2,3,4,5,6,7,8,9,10。
    f(i,j)代表在考虑前i项物品下,在重量j(0-10)下的最优解。
    然后考虑i+1项物品,即下面的(i+1)物品。通过递归,最后即可得到考虑所有物品的全局最优解。
  2. i+1物品是否可以加入:w(i+1)?w总
  3. 可以加入,比较加入和不加入收益(f),选取最大,更新f(i+1,j)
    加入(i+1)物品: v(i+1)+f(i,j-w[i+1])
    不加入(i+1)物品:f(i,j)

画图过程:

算法的过程可以直观参考下面的表格更新的过程
http://c.biancheng.net/algorithm/01-knapsack.html


02分组背包问题:

每组物品中只能选择一样

核心思想

  1. 组间的问题还是跟01背包一致。
  2. 组内问题,彼此间是互斥的。更新得到考虑前i组的最优解。(比如前i组有j项物品)
  3. f(i,j,h)表示为第i组,考虑前j个物品,在h的重量下的最优解。
    不同的地方如下,在更新时收益的计算(因为物品间是互斥的)
  4. 考虑i组j+1项:
  • 重量是否允许加入w(i,j+1)?w总
  • 可以加入,比较加入和不加入的收益
    加入:v(i,j+1)+f{i-1,jmax, h-(v(i,j+1)) }
    不加入:f{i-1,jmax,h}

eg:

A组:(1,2) (2,3)
B组:(1,3) (3,4)
C组:(5,10)(6,11)
。。。
(1,2) 1表示重量,2表示收益

物品 0 1 2 3 4 5 。。。 10
0 0 0 0 0 0 0 0
A (1,2) 0 2 2 2 2 2 2 2
A (2,3) 0 2 3 3 3 3 3 3
B (1,3) 0 3 5 6 6 6 6 6
B (3,4) 0 3 5 6 6 7 7 7
C (5,10)
C (6,11)

标黄即为组最优解。


03有依赖的背包问题

主件和附件,选择附件必须先选主件。附件的个数不超过2个。

核心思想

附件的个数比较少,然后可以分解为互斥事件:

  • 主件
  • 主件+附件1
  • 主件+附件2
  • 主件+附件1+附件2

相当于02问题的一个组,每个时间就相当于一个物品,转化为02问题。

你可能感兴趣的:(通用算法,动态规划,算法)