思路
首先再说01背包问题之前,先要了解一个概念,就是多阶段决策问题,我们都知道,对于动态规划来说核心就是状态的定义和状态转移方程,对于多阶段决策问题,阶段就对应状态,而01背包问题就是多阶段决策问题,核心就是找到状态转移方程。
想法
一开始看到背包问题很自然都就想到了贪心算法,但是对于01背包问题,是不适用的,因为贪心算法解决的背包问题中物品是可以取一部分的,所以才能尽可能的把‘’密度‘’比较大的物品放入背包,而01背包问题只有一个物品,且要么放入,要么不放入,就不能用贪心算法。
改变
既然贪心算法不适用,那么我们来想想用动态规划解决问题,因为对于每一个物品来说,有一个决策——放入或者不放入,那么首先我们要确定状态,如果我们把每一个剩余体积当作一个状态行不行呢?回想一下之前讲过的“硬币问题”,也是将每一个剩余金额作为一个状态,但是在这里是不适用的,为什么?因为硬币问题的决策判断条件是剩余金额大于等于硬币面值,但是这里却多了一个条件,就是每一个物品只能取一次,这样状态转移方程就不好写了。
这里我们引入“阶段”的概念,从第1个物品到第n个物品扫描,将每一次扫描的移动作为一次阶段,对于每一个阶段,决策就是对该阶段的物品的取或不取,解为d[i][j],表示对于第i个阶段,
分类:
1.如果剩余的体积小于物品体积,就不取,那么d[i][j]=d[i-1][j],
2.如果剩余体积大于等于物品体积,取得话就是d[i][j]=max(d[i-1][j-v[i]],d[i-1][j]);
这样状态转移方程就有了,接下来就是边界,很自然想到i==1的时候为0;
来源:https://blog.csdn.net/weixin_45080867/article/details/102753991