标签:sub 否则 时间性能 capacity center new 表示 bubuko 算法
给定n种物品和一个背包,物品(1<=i<=n)重量是wI ,其价值vi, 背包容量为C,对每种物品只有两种选择:装入背包和不装入背包,即物品是不可能部分装入,部分不装入。如何选择装入背包的物品,使其价值最大?
该问题是最优化问题,求解此问题一般采用动态规划(dynamic plan),很容易证明该问题满足最优性原理。
动态规划的求解过程分三部分:
一:划分子问题:将原问题划分为若干个子问题,每个子问题对应一个决策阶段,并且子问题之间具有重叠关系
二:确定动态规划函数:根据子问题之间的重叠关系找到子问题满足递推关系式(即动态规划函数),这是动态规划的关键
三:填写表格:设计表格,以自底向上的方式计算各个子问题的解并填表,实现动态规划过程。
如何定义子问题?0/1背包可以看做是决策一个序列(x1,x2,x3,…,xn),对任何一个变量xi的决策时xi=1还是xi=0. 设V(n,C)是将n个物品装入容量为C的背包时背包所获得的的最大价值,显然初始子问题是将前i个物品装如容量为0的背包中和把0个物品装入容量为j的背包中,这些情况背包价值为0即
V(i,0)=V(0,j)=0 0<=i<=n, 0<=j<=C
接下来考虑原问题的一部分,设V(I,j)表示将前i个物品装入容量为j的背包获得的最大价值,在决策xi时,已经确定了(x1,x2,…,xi-1),则问题处于下列两种情况之一:
为了确定装入背包中的具体物品,从V(n,C)的值向前推,如果V(n,C)>V(n-1,C),
则表明第n个物品被装入背包中,前n-1个物品被装入容量为C-wn的背包中;否则,第n个物品没有被装入背包中,前n-1个物品被装入容量为C的背包中,依次类推,直到确认第一个物品是否被装入背包中
结果如下:
|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | flag |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
W1=3,v1=25 | 1 | 0 | 0 | 0 | 25 | 25 | 25 | 25 | 0 |
W2=2,v2=20 | 2 | 0 | 0 | 20 | 25 | 25 | 45 | 45 | 0 |
W3=1,v3=15 | 3 | 0 | 15 | 20 | 35 | 40 | 45 | 45 | 1 |
W4=4,v4=40 | 4 | 0 | 15 | 20 | 35 | 40 | 55 | 60 | 0 |
W5=5,v5=50 | 5 | 0 | 15 | 20 | 35 | 40 | 55 | 65 | 1 |
在算法Knapsack中,第一个for循环的时间性能是O(n),第二个for循环的时间性能是O(C),第三个循环是两层嵌套for循环,时间性能是O(n*C),第四个for循环时间性能是O(n);
因此算法时间复杂度O(n*C)
标签:sub 否则 时间性能 capacity center new 表示 bubuko 算法
原文地址:https://www.cnblogs.com/gaochaochao/p/9214296.html