背包学习小记(1)

  01背包

  有N件物品,容量为V的背包。第 i 件物品的费用是c[i] ,价值是w[i] 。求能放入背包的物品的最大价值。

  每件物品可以选择放或不放,定义f[i][v]表示前 i 件物品恰放入一个容量为 v 的背包可以获得的最大价值。

  f[ i ][ v ] = max{f[ i-1 ][ v ] , f[ i-1 ][ v-c[i] ]+w[i]}

  时间和空间复杂度都是 O(VN)。

  优化空间复杂度

  肯定有一个主循环 i=1...N,每次算出来二维数组f[i][0...V]的所有值。

  令f[v] = f[i][v]

  f[i][v] 是由 f[i-1][v] 和f[i-1][v-c[i]]两个子问题推来,每次在主循环中,我们以v=V...0的顺序推f[v],这样才能保证推f[v]是,f[v-c[i]]保存的是f[i-1][v-c[i]]的值,伪代码如下:

  for i = 1...N
    for v = V...0
      f[v] = max{f[v],f[v-c[i]]+w[i]};

  初始化的细节问题

  如果要求恰好装满背包,初始化时,f[0]为0,其余为-∞。如果不要求恰好装满背包,全部初始化为0。

  完全背包

  

原文地址:https://www.cnblogs.com/yongren1zu/p/3360059.html