背包问题是基础的动态规划问题,包含了0-1背包,完全背包,多重背包等。
0-1背包
存在容量为 的背包 , 件体积分别为,重量为的物品。求解将哪些物品放入背包使得体积不超出 的情况下重量最重,物品不得重复使用。
解法
对于 0-1背包问题,每一件物品只存在放或者不放这两种情况。例如,讨论是否放入最后一个物品存在两种情况:
- 不放入该物品,那么结果转化为 容量为,物品为前子问题的结果
- 放入该物品,那么结果转化为容量为,物品为前子问题的结果 +
利用函数 表示前 件物品放入容量为的背包中所能获得的最大重量,那么我们的问题结果为:
等式右边两个函数分别表示情况1, 2所对应的结果,取其中较大的则为问题最终的结果。同样,这个函数可以扩展到一般情况,即把换成:
这里举一个实际的例子来说明这个算法,对于,,来说,我们实际上要求.根据上式:
而:
可以看出,这是一个递归的问题,最终当即可退出递归,而:
同过一系列的递归,则可以求得最终的值。用python来描述即为:
def one_zero_r(C, W, V):
def helper(i, v, dir):
if not i:
return W[0] if v >= C[0] else 0
if v >= C[i]:
return max(helper(i - 1, v - C[i]) + W[i], helper(i - 1, v))
else:
return helper(i - 1, v)
return helper(len(C) - 1, V)
同时,还可以画出求解的状态图:
状态图
网友评论