一个经典的动态规划的问题,对于每个物品,只有装或者不装两种选项,我们需要让背包装的价值尽可能高,并且不超过总重量C。
像之前很多题目的解法一样,例题将01背包问题转化为一个最优子结构的问题,每次从背包里装的东西一定是在上一个最优结构的基础上寻找的最优解。比如一个背包容量为11,按顺序=6+3+1,那么最后一步+1一定是在6+3的基础上,背包余量=11-6-3=2时寻找的最优解。同理3是在6的基础上找到的最优解,那么此时余量是11-6=5。Xi=0时代表i号物品没被选择,反之Xi=1代表被选中,我们用ΣViXi表示背包物品的总价值,物品选择最优解(y2+...yn)=(y1+...yn)-y1那么我们要找到这个总价值的最大值,并且其重量之和ΣWiXi《= C-WiY1
(上图中有一处错误)
每当我们装入一个物品i,那么背包的价值会加 Vi,而总重量会变成C-Wi。m(i,j)代表从i开始到n的当前背包余量为j的01背包问题的最优解。若余量可装下Wi,那么比较装下Wi即m(i+1,j-Wi)+Vi和不装下Wi即m(i+1,j)哪个价值更大,哪个即为最优子结构。如果j<Wi,那就是装不下,就不装i物品看下一次m(i+1,j)
而m(n,j)当j>=Wn时初始化,即为装下了n号物品。
记得之前学习01背包问题时是根据性价比来装填的,但是这也会导致很多问题,甚至无法得出正确答案,不如动态规划。
通过三角划分,01背包问题我们可以看到动态规划的问题的另一个特点,我们在求解一个最优解的时候,一定是在上一层的最优解的基础之上所求得的。因此最优解问题也可以看作一个逐层求最优解结构的动态规划问题,我们用数组名称来表示最优解结构,用数组内容表示其对应的权值大小。通过由内到外,由浅到深求出每层最优解结构就能求出整个问题的最优解!