01背包问题

痞子三分冷 提交于 2019-12-02 11:01:07

思路

首先再说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;

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!