想学习背包问题,在网上百度了很久,看到一位大神写的,由于自己基础太差...很长时间才看懂.....理解了之后自己也用c++写出了一段代码,写这篇文章的目的就是希望有一些像我一样的小白重新遇到这个问题的时候可以更容易入手,虽然班门弄斧,但希望能相互学习。
首先,01背包的背景可以自行百度,我主要想说一下关于这个算法。首先贴出来代码吧,因为我想就代码的内容说一下
是用一个二维数组,横坐标是从1到最大的重量,纵坐标是每一个物体,数组中存的就是价格。而第一行和第一列留空的0(见下表)是为了让i,j的数值与重量和物体编号相匹配。我们都知道,第19行是核心,我也就这个问题详细说一下。
配上上面的注释,还有那张表
这张表对应的数据是
10 3
3 4
4 5
5 6
我们是对二维数组一行一行往下扫,举个例子,当扫到c[4][2]的时候,这时能放进去的
最大重量是4,而能放进去的物体是前两种,这是就可以把问题看成
max(放入第2个物体,不放入第2个物体),
如果放入的话,第二个物体的重量正好与最大重量相等,
这样的话,价格就是4,
不放入的话,就是它之前的物体的重量不大于j的组合的价格,
只能是3,
那就放入,把c[4][2]赋为4。
如果扩展的话,就可以基本按照上面的推法,进行计算,
到达c[m][n]的时候就是最大的价格。
-------------------------------------------------------------------------------
我只是把这个问题自己把代码实现了一下,而关键的思想的话还是看到别人的讲解理解的,要看更加正规一点的话还是FG0026大神的原帖,如果不明白的话结合这篇文章的话可能会有点帮助。
可能我也有一些地方讲的不太清楚,我也是刚学c++的小白,还望大家指导和相互学习,如果有不明白的地方,留言的话我会回复的~