0_1背包问题

来源:互联网 发布:vc6.0二级c语言加油站 编辑:程序博客网 时间:2024/06/05 02:11

有n个物品和购物车的容量,每个物品的重量为w[i],价值为v[i],购物车容量为W。选若干个物品放入购物车中,使价值最大。重量不能够超过购物车容量。


原问题约数条件和目标函数如下: 

子问题的约数条件和目标函数如下:

我们只需要证明:原问题的解去掉,x1为子问题的最优解。即证明最优子问题结构的性质。

(1)假设已经知道了X={x1,x2,...,xn}是原问题{a1,a2,...,an}的最优解,那么原问题去掉第一个物品就变成子问题{a2,a3,...,an},则X'={x2,x3,...,xn}是子问题的最优解

(2)通过最优子结构性质建立最优值递归式

可以对每个物品依次检查是否放入或者不放入。

用c[i][j]表示前i件物品放入一个容器为j的购物车可以获得的最大价值。

不放入第i件物品,xi=0,购物车的价值不增加,那么子问题就转化为“前i-1件物品放入容量为j的背包中”,最大价值为c[i-1][j]。

放入第i件物品,xi=1,装入购物车的价值增加了vi。


以上是问题转化的数学模型。wi是第i件商品的总重量,j是购物车的容量

原创粉丝点击