动态规划之0-1背包问题
问题描述
现给定n种物品以及一容量为c的背包,物品具有质量和价值两个属性,物品i的质量为wi,价值为vi。问如何选择装入背包的物品,才能使得背包中物品的总价值最大?
问题分析
给定数据为背包容量c = 10, 物品种类n = 5, 物品质量w[n] = {2, 2, 6, 5, 4}, 物品价值v[n] = {6, 3, 5, 4, 6}。
要解决这个问题,只需要以某种形式填写下方这张表即可了解用动态规划解决0-1背包问题的思想。这张表的纵坐标[0, 10]所表示的是背包的容量,横坐标[1, 5]所表示的是物品的种类,为了后续的叙述方便,将表看作一个二维数组,并用小写字母d来表示。
重量w | 价值v | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 6 | |||||||||||
2 | 2 | 3 | |||||||||||
3 | 6 | 5 | |||||||||||
4 | 5 | 4 | |||||||||||
5 | 4 | 6 |
说明
- d[5][0]所表示的就是第5行第0列的位置,所代表的含义就是当背包容量为0时(只考虑5号物品),所能够形成的最大价值。
- d[4][1]所表示的就是第4行第1列的位置,所代表的含义就是当背包容量为1时(考虑5号和4号物品),所能够形成的最大价值。
- d[3][2]所表示的就是第3行第2列的位置,所代表的含义就是当背包容量为2时(考虑5号,4号和3号物品),所能够形成的最大价值。
填表
上文中我们已经知道了表格中空位置所代表的含义,填这张表之前,还有以下两点需要大家知道:
1. 这张表应该是由下至上,由左至右来进行填写的;
2. 对于每一种物品,只对应着两种状态,装入背包和不装入背包;
知道了以上信息后,便可以开始对这张表进行填写了。
- 因为表的填写是由下至上,由左至右来进行填写,所以第一个填写的位置应该是d[5][0]位置,此时,背包的容量为0(只考虑5号物品),因为5号物品的重量w[5] = 4,容量为0背包不能够容纳重量为4的物品,所以d[5][0]位置所能形成的最大价值为0。
- 同理,在d[5][1], d[5][2], d[5][3]这几个位置所能形成的最大价值也为0。
此时表格变成如下所示:
重量w | 价值v | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 6 | |||||||||||
2 | 2 | 3 | |||||||||||
3 | 6 | 5 | |||||||||||
4 | 5 | 4 | |||||||||||
5 | 4 | 6 | 0 | 0 | 0 | 0 |