上一个版本的0-1背包代码的复杂度:时间复杂度O(n*C)空间复杂度O(n*C)

优化思路如下:

0-1背包问题:

F(n,C)考虑将n个物品放入背包为C 的背包,使得价值最大。

状态转移方程:F(i,c) = max(F(i-1 , c)  ,   v(i)+ F(i-1, c- w(i)  )

根据状态转移方程,第i行元素计算只依赖与i-1行元素。理论上我们只需要保持两行元素。

如上图,我们初始化后第一行存放0行元素,第二行存放1行元素。而第二行元素可以之间使用不再使用的0行元素。

发现规律:第一行一直为偶数行,第二行一直为奇数行,所以我们可以使用一个行数为2的二维数组来储存。

代码如下:

class Knapsack02{public int knapsack02(int[] w , int [] v, int C){assert(w.length == v.length && C>=0);int n = w.length;if(n == 0 || C==0)return 0;int[][] memo = new int[2][C+1];//第一行初始化。for(int i = 0 ; i<=C ; i++)memo[0][i] = (i>=w[0]?v[0]:0);for(int i =1 ; i<n ; i++)for(int j =0 ; j<=C ; j++){memo[i%2][j] = memo[(i-1)%2][j];if(j>=w[i])memo[i%2][j] = (int)Math.max(memo[i%2][j] , v[i]+memo[(i-1)%2][j-w[i]]);}return memo[(n-1)%2][C];    }}

空间复杂度:O(2*C)

继续优化:

使用上一篇的例子,将其优化为两行。

发现dp[i][j] 只需要上一行的左边与上方的元素,而右边的元素并不需要。故尝试如下优化

我们仅仅使用一行元素记录。

更新位置5的元素,只需要位置3的元素以及自己(即上一种情况的上一行元素)即可。

同理,更新位置4也仅仅需要自己当前元素以及位置2的元素。

优化后数组为此。

我们仅仅需要一行元素,找到其对应的dp[j-v(i)]即可(物理意义为,掏空足够的空间,放入当前元素,选取不放入当前元素和放入的较大值)。

代码实现如下:

class Knapsack03{public int knapsack03(int[] w , int [] v, int C) {assert (w.length == v.length && C >= 0);int n = w.length;if (n == 0 || C == 0)return 0;int[] memo = new int[C + 1];//第一行初始化。for (int i = 0; i <= C; i++)memo[i] = (i >= w[0] ? v[0] : 0);for (int i = 1; i < n; i++)for (int j = C; j >= w[i]; j++) {memo[j] = (int) Math.max(memo[j], v[i] + memo[j - w[i]]);}return memo[C];}
}

转载于:https://www.cnblogs.com/rainxbow/p/9719336.html

#动态规划 0-1背包问题空间复杂度优化相关推荐

  1. 动态规划——0/1背包问题(全网最细+图文解析)

    ✨动态规划--0/1背包问题(全网最细+图文解析) 作者介绍:

  2. 动态规划0—1背包问题

    动态规划0-1背包问题 Ø    问题描写叙述:    给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问应怎样选择装入背包的物品,使得装 入背包中物品的总价值最大? Ø   ...

  3. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  4. 0/1背包问题——动态规划方法

    1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...

  5. 【动态规划】0/1背包问题

    问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec  内存限制: 64 MB 提交: 152  解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...

  6. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

  7. 动态规划之0/1背包问题(动态规划入门)

    动态规划很早以前就接触过但是因为太晦涩难懂一下子到现在才开始真正的学习到其中的道理,0/1背包问题是动态规划的入门类问题 比较好理解 首先我们要知道动态规划是用于解决最优解的问题 它是一种思想而不是一 ...

  8. 0/1背包问题-----动态规划求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  9. 经典动态规划:0-1 背包问题

    经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...

最新文章

  1. ECMAScript3中数组方法
  2. word手写字体以假乱真_学会Word上下标,搞定公式输入
  3. 闪回表操作语法+使用闪回删除
  4. python绘制散点图的函数_python绘制散点图
  5. 乔布斯声称Google先决定当苹果的敌人
  6. 威纶通触摸屏部分元件下载后不显示且编辑时无法选择
  7. 前端国际化辅助工具——自动替换中文并翻译
  8. 软件观念革命:交互设计精髓_专业科班答案:一个标准的交互设计流程是怎样的?...
  9. 移动机器人路径规划算法综述(二)
  10. 社团管理系统数据流图_实例6:社团管理系统数据库设计
  11. 计算机辅助设计技术领域的应用,计算机辅助设计技术在机械设计中的应用探讨...
  12. python图片保存jpg、show变成bmp_python bmp转换为jpg 并删除原图的方法
  13. java常用逻辑运算
  14. UVALive - 8270 A Partial Order Relation 哈斯图边数
  15. 苹果内置录屏SDK-ReplayKit库的使用说明
  16. OpenNLP ngram n元语法模型(简介)
  17. 【ybt金牌导航2-3-3】【luogu P3975】K小子串 / 弦论
  18. 江淮汽车回应为小米代工;腾讯起诉腾迅获赔 30 万;鸿星尔克因公司系统崩溃、恳请顾客退款 | EA周报...
  19. 从爬取豆瓣影评到基于朴素贝叶斯的电影评论情感分析(上)
  20. 12个乒乓球,其中有11个球每个球重量一模一样,另外1个球重量和那11个球不一样.用天平称三次,把单独的球(和那11个重量不一样的球)找出来

热门文章

  1. 【java笔记】方法引用介绍和使用
  2. 题目 1885: 2017 分巧克力
  3. leetcode 206 如何原地反转单链表?
  4. FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
  5. python字符串方法总结_python字符串使用方法总结
  6. python open可以打开什么类型文件_Python打开文件open()的注意事项
  7. easyui的tree节点的获取和选中
  8. PLSQL 缺少MSVCR120.dll
  9. 攻防世界 pwn 二进制漏洞简单题练习区 答题(1-10题解)
  10. 开发商微信选房后不退认筹金_新楼盘开盘的“认筹”和“认购”,劝您看懂后再去认!...