问题描述
有n个物品,每个物品都有各自的体积和价值,现有给定容量的背包,如何装物品使背包里的物品具有最大的价值总和?
动态规划原理
假设此时有4个物品,背包的容量为8
number = 4,capacity = 8
每个物品的体积和价值如下:
i | 1 | 2 | 3 | 4 |
体积(w) | 2 | 3 | 4 | 5 |
价值(v) | 3 | 4 | 6 | 5 |
动态规划主要要搞清楚的两个问题 1.状态表示,即 f [ i , j ] 表示的含义以及它如何表示 2.状态计算
现在我们来搞清楚第一个问题,状态表示,首先,i代表背包只能从前i 个中选择,j代表背包的容量,将 f [ i , j ]看作是一个集合,这个集合中包含了在背包容量不大于j,前i个物品中的所有选法。将这个集合分类,可以分为包括第i个物品的集合与不包含第i个物品的集合,不包含第i个物品也就相当于f [ i - 1, j ],包含第i个物品的集合又该怎么求呢?我们先将第i个物品去掉,在加上它的价值,也就是 f[ i - 1, j - w(i)] + v(i),此时也就是计算f [ i - 1, j - w(i)]这个集合的值加上第i个物品的价值。
状态计算:f [ i , j ] = max( f [ i - 1,j ] , f[ i - 1 , j - w(i)] +v(i)) ,得出这个状态转移式子,我们就可以计算粗每个集合的最大值