从0-1背包问题到动态规划
算法——贪心算法解0-1背包问题
1. 问题的描述
背包问题是一类问题,其下有很多变形。
一个背包里可放入重量为 w 的物品,现有 n 件物品的集合 S,其中物品的重量分别是
2. 问题的形式化求解
假设 w >= 0, n >= 0。用记号 knap(w, n) 表示 n 件商品相对于重量 w 的背包问题,在考虑它是否有解时,通过考虑一件物品的选或者不选,可将原问题划分为两种情况(递归缩小问题的规模):
- 最后一件商品(质量为
wn−1 )不选,knap(w, n-1) 就是 knap(w, n) 的解; - 如果选择最后一件商品,那么 knap(w-w_{n-1}, n-1) 的解也是 knap(w, n) 的解;
def knap_rec(w, ws, n):
if w == 0:
return True
if w < 0 or (w > 0 and n < 1):
return False
return knap_rec(w, ws, n-1) or knap_rec(w-ws[n-1], ws, n-1)