从0-1背包问题到动态规划
算法——贪心算法解0-1背包问题

1. 问题的描述

背包问题是一类问题,其下有很多变形。

一个背包里可放入重量为 w 的物品,现有 n 件物品的集合 S,其中物品的重量分别是 w0,w1,,wn1(可简单理解为 n 件商品各不相同) 。问题在于能否从中选出若干件物品,其重量之和正好等于 w

2. 问题的形式化求解

假设 w >= 0, n >= 0。用记号 knap(w, n) 表示 n 件商品相对于重量 w 的背包问题,在考虑它是否有解时,通过考虑一件物品的选或者不选,可将原问题划分为两种情况(递归缩小问题的规模):

  • 最后一件商品(质量为 wn1)不选,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)
posted on 2016-08-14 11:26  未雨愁眸  阅读(275)  评论(0编辑  收藏  举报