01背包题目 (动态规划算法)

P01: 01背包问题

问题
给定 N 种物品和一个容量为 V 的背包,物品 i 的体积是 wi,其代价为 ci
(每种物品只要一个)
问:怎样挑选装入背包的物品,使得装入背包中的物品的总代价最大?

面临每一个物品,我们只要挑选放入或许不放入两种挑选,每种物品只能放入一次。

我们用之前一样的思绪来走一遍尝尝
假定只剩下末了一件物品,我们有两种挑选
1.盈余空间充足时,挑选放入
2.盈余空间不足时,不放入

所以我们有两个最优的子构造:
1.容量为V的背包放入i-1件物品的最优挑选
2.容量为V-w[i]的背包放入i-1件物品的最优挑选

所以,综合起来就是:
i 件物品放入容量为V的背包的最优挑选:
max(容量为V的背包放入i-1件物品的最优挑选,容量为V-w[i]的背包放入i-1件物品的最优挑选+c[i])

我们用f[i] [v]示意前 i 件物品放入容量为 v 的背包中可以获得的最大代价。
用子问题定义状况:
其状况转移方程是:f[i] [v] = max{f[i-1] [v],f[i-1] [v-w[i]]+c[i]}

我们先假定
背包总容量为V = 12
物品的容量数组为 w = [4, 6, 2, 2, 5, 1]
代价数组为 c = [8, 10, 6, 3, 7, 2]

  1. f(i,v) = 0 (i<=1, v<w[0]);
  2. f(i,v) = c[0] (i==1, v>=p[0]);
  3. f(i,v) = f(i-1,v) (i>1, v<w[i-1])
  4. f(i,v) = max(f(i-1,v), f(i-1,v-w[i-1])+c[i-1])(i>1, v>=w[i-1])

《01背包题目 (动态规划算法)》

我们每次从左至右,保留前一次的数据
从上至下时,保留前一行的数据
所以我们总的来说只用保留一行的数据,空间复杂度为O(V)
时候复杂度为O(N*V),空间复杂度为O(V);

然则,假如我们用原始的递归要领去做,即排列组合的要领去做时
时候复杂度为O(2^N);

那末当V很大,N较小时,比方V=1000,N=6时,用递归只用盘算2^6=64次,而备受推重的动态计划就需要盘算1000*6=6000次

所以说,算法没有相对的优劣,症结要看运用的惨景

    原文作者:幼稚
    原文地址: https://segmentfault.com/a/1190000015944719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞