动态规划——背包问题

问题描述:

有n个物品,编号1,2,3,、、n,其中第 i 个物品重量为Wi 价值 Vi ,有一个容量为W的背包。

在容量允许范围内,如何选择物品,可以得到最大的价值。(为了简单起见,假设物品的重量 Wi 和价值Vi 都是正数)

 

根据取物品的方式,背包问题又可以被分为三类:

0/1背包问题(0-1 knapsack problem)

这也是最常见的背包问题,对于每个物品,要么取走要么不取走,每个物品只能取一次。

可以用数学表达式表示为:

  • maximize   \qquad \sum_{i=1}^n v_ix_i
  • subject to  \qquad \sum_{i=1}^n w_ix_i \leqslant W, \quad \quad x_i \in \{0,1\}

其中xi只能为1 或者0  所以称为背包问题。

 

这个问题要求解的是能用背包带走的物品的最大价值。

定义 m[i,w] 为:用第1,、2、3、、i 个物品装入质量<=W的背包的最大价值。

m[i,w]的取值情况分析:

1)m[0,\,w]=0  ,背包的质量为w,里面没有物品,所以它的价值为0;

2)m[i,\,0]=0   ,背包质量为0,所以里面没法装任何东西, 不论前面的 i 是多少,总价值为0;

对于任意的第 i  个物品,有两种情况,放进背包或者不放。

不要第 i  个物品 如果w_i > w\,\! 则:

3)m[i,\,w]=m[i-1,\,w]    因为第i 个物品的重量大于背包的容量,所以不可放入。

如果w_i \leqslant w. 那么

4)m[i,\,w]=\max(m[i-1,\,w],\,m[i-1,w-w_i]+v_i)  

对于第 i 个物品,有两种可选择方案:

如果放入背包中,那么 m[i,w]=m[i-1,w-wi]+vi 也就是 i 的前一个的最大值加上自己的价值。

如果不要第 i 个物品,那么:m[i,w]=m[i-1,w]。也就是 i 的前一个的最大值。

因为背包问题最后要取得最大的价值,所以就选这两种情况中价值最大的。

在这个问题中,定义子问题: m[i,w] 对于每个子问题,都可通过上面的分析求出。通过3),4)可以发现,每一次求取子问题,问题的规模就被缩小。

要么在w 上减小,要么在 i 上减小。最后问题的规模会被缩小为 m[i,0]和m[0,w].而这两个的值都为0,只要逆向思维反推回去,就能逐步得到问题的解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值