今天做了一个很简单的dp题目,发现自己没什么思路,经过百度指点才发现是完全背包。然后开始重新补习了一下背包,从01开始整理吧。
0,1背包是放与不放两种状态,于是称作01.
题目:
有N件物品和一个容量为V的背包。放入第i件物品消耗的空间为Ci,得到的价值是Wi。求解将哪些物品放入背包可使价值总和最大。(blog主要给出求最大和的方法)
思路:
F[i,v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。(前i件物品中可以含有不放入背包的)
F[i,v] = max{F[i-1,v],F[i-1,v-Ci]+Wi}
只考虑第i件物品,{1不放入,问题转化为:前i件物品放入容量为v的背包
{2 放入, 问题转化为:前i-1件物品放入容量为v-Ci的背包中,再在背包中加入第i个物品,使得容量为v,且总价值+Wi
下面贴出伪代码:
F[0,0...V]=0
for i=1 to N
for v=Ci to V
F[i,v] = max{F[i-1,v],F[i-1,V-Ci]+Wi}
此算法的时间复杂度为O(VN)
有将空间复杂度简化的方法,
F[v] = max{F[v],F[v-Ci]+Wi}
下面贴出伪代码:
F[0...V] = 0
for i=1 to N
for v=V to Ci
F[v] = max{F[v],F[v-Ci]+Wi}
此处注意简化之后,第二层循环的顺序变为逆循环。