动态规划的定义不明白的小伙伴自己动手百度吧,这里不再重述,我们直接切入正题。
0-1背包问题:假设有一个背包,其容量为 。在地上有一堆物品,其数量为,每个物品有两种属性:重量和价值,那么我们就会想到这样的一个优化问题:
即,找到一个物品的组合,使得它们的重量小于等于背包最大容量,并且价值最大。
举例:现有一个背包,容量,物品的个数,每个物品的重量,价值。
我们分两步确定:确定背包可以装物品的最大价值、确定背包中物品的组合。
1、确定背包可以装物品的最大价值
现在我们给出一个表格记录每个状态下,背包中物品的最大价值。表格中的行,表示第件物品;表格中的列,表示背包中的剩余容量。表格中第行,第列中元素表示的含义是:拿第件物品,剩余容量下的最大价值。
(1) ,不拿物品。背包可能有两种状态:背包是空的、塞满没有价值的东西。这时, ;
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
(2) ,背包中没有剩余容量。背包塞满没有价值的东西。这时, ;
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | ||||||||
2 | 0 | ||||||||
3 | 0 | ||||||||
4 | 0 |
(3) ,拿第一件物品,重量。背包可能有三种状态:背包是空的、装了一部分没有价值的东西、塞满没有价值的东西。这时,我们需要判断背包剩余容量和的关系计算:
- 当时,即背包中的剩余容量放不下这个物品,背包中的价值为上一个状态中背包中的价值,有。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | |||||||
2 | 0 | ||||||||
3 | 0 | ||||||||
4 | 0 |
- 当时,即背包中的剩余容量可以这个物品,所以将这件物品放进背包后,背包剩余容量的价值。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | ||||||||
3 | 0 | ||||||||
4 | 0 |
(4) ,拿第二件物品,重量。背包可能有三种状态:背包是空的、装了一部分没有价值的东西、塞满没有价值的东西。这时,我们需要判断背包剩余容量和的关系计算:
- 当时,即背包中的剩余容量放不下这个物品,背包中的价值为上一个状态中背包中的价值,有。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | ||||||
3 | 0 | ||||||||
4 | 0 |
- 当时,即背包中的剩余容量可以放下这个物品,所以将这件物品放进背包后,背包剩余容量的价值。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 | 0 | ||||||||
4 | 0 |
(5) ,拿第三件物品,重量。背包可能有三种状态:背包是空的、装了一部分没有价值的东西、塞满没有价值的东西。这时,我们需要判断背包剩余容量和的关系计算:
- 当时,即背包中的剩余容量放不下这个物品,背包中的价值为上一个状态中背包中的价值,有。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 | 0 | 0 | 3 | 4 | |||||
4 | 0 |
- 当时,即背包中的剩余容量可以放下这个物品,所以将这件物品放进背包后,背包剩余容量的价值。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 | 0 | 0 | 3 | 4 | 5 | 5 | 8 | 9 | 9 |
4 | 0 |
观察表格,发现,为什么?,我们应该怎么拿商品才能使得剩余容量的价值最大?
- 如果拿第三件物品,背包中剩余容量为,我们怎样计算容量为1时怎样那物品才能使背包中物品价值最大?那么这就追溯到前一个状态,就是拿第二件物品时,剩余容量时的最大价值。所以,。
- 如果不拿第三件物品,背包中剩余容量为,那么这就追溯到前一个状态,就是拿第二件物品时,时的价值。所以,。
由此,我们知道,当背包中剩余容量为时,拿两件(第一件和第二件)物品()比只拿第三件()物品的价值大。
总结一下,当我们考虑是否拿第件物品时,剩余容量的最大价值的计算为:
以上公式就是0-1背包问题的状态转移方程。根据这个状态转移方程,我们重新计算和更新一下表格。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 |
4 | 0 |
(6) ,拿第四件物品,重量。表格的更新自己动手计算一下吧,验证一下你对0-1背包问题的理解。这里给出最终的表格。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 |
4 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 10 |
2、确定背包中物品的组合
根据状态转移方程,得到物品组合。
(1) ,可以知道物品组合中有第四件物品。除去第四件物品,剩余物品组合所占的容量为,价值为;
(2) ,所以没有拿第三件物品,;
(3) ,可以知道物品组合中有第二件物品。除去第二件物品,剩余物品组合所占的容量为,价值为.
所以,背包中装第二件物品和第四件物品可以得到最大价值。
以上是本人对0-1背包问题的理解,如有错误,欢迎留言纠正!
网友评论