从0-1背包问题到动态规划 算法——贪心算法解0-1背包问题
1. 问题的描述
背包问题是一类问题,其下有很多变形。
一个背包里可放入重量为 w 的物品,现有 n 件物品的集合 S,其中物品的重量分别是
w0,w1,…,wn−1
(可简单理解为 n 件商品各不相同) 。问题在于能否从中选出若干件物品,其重量之和正好等于 w。
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)
转载请注明原文地址: https://ju.6miu.com/read-1297413.html