动态规划4背包问题

贪心算法。

1、先放入价值最大的。这个肯定不行

2、放入平均价值最大的,也不行

 

 

 

 

 

 

 

 

二维数组作为记忆化搜索

 

 

 

第一行,只有0这个物品的时候,对应容量的最大值

第二行,考虑0和1两件物品的时候

第三行,0,1,2都考虑

(1,2)这个点

对1考虑放入1,对0考虑容量为0的时候,对应的大小。两个加起来和6比较

 

 

 

对于第三行来数

2,0 肯定是0,因为没有容量

2,1 此时只能放入价值为6的物品

2,2的时候,参考上面的最大值,因为容量是2,还不能考虑自身(容量3)

对于2,3

第一种是不考虑自身,那么最大值就是上面的16

第二张是考虑自身,把自己放进去刚好占满,价值是12,以及加上(1,0)【这种是0和1都考虑之后,容量为0的情况】

所以取两者最大值16

 

 

 

 

 

 

大前提:每个物品只能选一次

动态规划

 

 

空间复杂度的优化

 

 

交替使用

 

 上面永远是i为偶数,下面永远是i为奇数

 

i只需%2即可

 

空间可以大很多很多

 

其实一行空间也可以

观察到每次只需要使用左边和上边的元素,根本不会碰到右边。

 

当现在要填1那一行的时候,从右边填起,根本不会有影响。

上一行的内容,就是自己。左边的内容,就是左边。

 

 

 

代码也更优雅

 

 

posted @ 2018-07-04 21:12  朋友圈  阅读(95)  评论(0编辑  收藏  举报