背包问题是非常经典的动态规划问题,这里设计到空间开销的问题,以下对方法不断改进,优化空间开销。

1.记忆化搜索

时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
空间复杂度: O(n * C)

#include <iostream>
#include <vector>
#include <cassert>using namespace std;/// 背包问题
/// 记忆化搜索
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
/// 空间复杂度: O(n * C)
class Knapsack01{private:vector<vector<int>> memo;// 用 [0...index]的物品,填充容积为c的背包的最大价值int bestValue(const vector<int> &w, const vector<int> &v, int index, int c){if(c <= 0 || index < 0)return 0;if(memo[index][c] != -1)return memo[index][c];int res = bestValue(w, v, index-1, c);if(c >= w[index])res = max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));memo[index][c] = res;return res;}public:int knapsack01(const vector<int> &w, const vector<int> &v, int C){assert(w.size() == v.size() && C >= 0);int n = w.size();if(n == 0 || C == 0)return 0;memo.clear();for(int i = 0 ; i < n ; i ++)memo.push_back(vector<int>(C + 1, -1));return bestValue(w, v, n - 1, C);}
};
  1. 动态规划
    时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
    空间复杂度: O(n * C)
#include <iostream>
#include <vector>
#include <cassert>using namespace std;/// 背包问题
/// 动态规划
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
/// 空间复杂度: O(n * C)
class Knapsack01{public:int knapsack01(const vector<int> &w, const vector<int> &v, int C){assert(w.size() == v.size() && C >= 0);int n = w.size();if(n == 0 || C == 0)return 0;vector<vector<int>> memo(n, vector<int>(C + 1,0));for(int j = 0 ; j <= C ; j ++)memo[0][j] = (j >= w[0] ? v[0] : 0 );for(int i = 1 ; i < n ; i ++)for(int j = 0 ; j <= C ; j ++){memo[i][j] = memo[i-1][j];if(j >= w[i])memo[i][j] = max(memo[i][j], v[i] + memo[i - 1][j - w[i]]);}return memo[n - 1][C];}
};

3.动态规划改进: 滚动数组
时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
空间复杂度: O©, 实际使用了2*C的额外空间

#include <iostream>
#include <vector>
#include <cassert>using namespace std;/// 背包问题
/// 动态规划改进: 滚动数组
/// 时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
/// 空间复杂度: O(C), 实际使用了2*C的额外空间
class Knapsack01{public:int knapsack01(const vector<int> &w, const vector<int> &v, int C){assert(w.size() == v.size() && C >= 0);int n = w.size();if( n == 0 && C == 0 )return 0;vector<vector<int>> memo(2, vector<int>(C + 1, 0));for(int j = 0 ; j <= C ; j ++)memo[0][j] = (j >= 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] = max(memo[i % 2][j], v[i] + memo[(i-1) % 2][j - w[i]]);}return memo[(n-1) % 2][C];}
};

4.动态规划改进
时间复杂度: O(n * C) 其中n为物品个数; C为背包容积
空间复杂度: O©, 只使用了C的额外空间

public:int knapsack01(const vector<int> &w, const vector<int> &v, int C){assert(w.size() == v.size() && C >= 0);intn = w.size();if(n == 0 || C == 0)return 0;vector<int> memo(C+1,0);for(int j = 0 ; j <= C ; j ++)memo[j] = (j >= w[0] ? v[0] : 0);for(int i = 1 ; i < n ; i ++)for(int j = C ; j >= w[i] ; j --)memo[j] = max(memo[j], v[i] + memo[j - w[i]]);return memo[C];}
};

一层一层剥开背包问题相关推荐

  1. Synchronized解析——如果你愿意一层一层剥开我的心

    前言 synchronized,是解决并发情况下数据同步访问问题的一把利刃.那么synchronized的底层原理是什么呢?下面我们来一层一层剥开它的心,就像剥洋葱一样,看个究竟. (想自学习编程的小 ...

  2. Synchronized解析——一层一层剥开洋葱的心

    Synchronized解析--一层一层剥开洋葱的心 引入:https://juejin.im/post/5d5374076fb9a06ac76da894#heading-9 前言 synchroni ...

  3. synchronized同步机制——如果你愿意一层一层剥开我的心

    前言 synchronized,是解决并发情况下数据同步访问问题的一把利刃.那么synchronized的底层原理是什么呢?下面我们来一层一层剥开它的心,就像剥洋葱一样,看个究竟. Synchroni ...

  4. CNN剖析:如果你愿意一层一层剥开CNN的心

    机器不学习 www.jqbxx.com : 深度聚合机器学习.深度学习算法及技术实战 如果你愿意一层一层剥开CNN的心--你会明白它究竟在做什么 一直以来,卷积神经网络对人们来说都是一个黑箱,我们只知 ...

  5. 生活就像个洋葱,一层一层剥开它,总有一层让你流泪

    Life is like an onion; you peel it off one layer at a time, and sometimes you weep. 生活就像个洋葱,一层一层剥开它, ...

  6. C语言《C Primer Plus 》 演示递归,递归就像洋葱,假设一个洋葱横切,从外面一层一层打开,每一层都调用一次函数

    <C Primer Plus >例题解析 程序清单 9.6 recur.c 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h ...

  7. PAT甲级1127 ZigZagging on a Tree (30分):[C++题解]之字形层次遍历树bfs实现一层一层读入

    文章目录 题目分析 题目链接 题目分析 分析 给定中序遍历和后序遍历,先建树: 后面就是写一个bfs,层序遍历稍微改改即可. bfs要做的修改是如何一层一层的读入.令根结点是第一层,本题的之字形遍历就 ...

  8. 多层select,一定要仔细从里到外一层一层的剥开

    今天修改客户反馈的一个bug,客户描述为,选择相关联系人有时候会提示为空,而正常情况为上次的选择记录. 首先在一堆的js里面梳理,确认存储记录没有问题,而且在只有一条数据时没有问题,当出现第二条数据时 ...

  9. JSON:如果你愿意一层一层剥开我的心,你会发现...这里水很深——深入理解JSON...

    2019独角兽企业重金招聘Python工程师标准>>> 我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题,请问,以下JS对象通过JSON.stringify后的字符串是 ...

最新文章

  1. nginx conf 文件配置
  2. 短小有趣的c语言代码,分享一段有趣的小代码
  3. MySql 从查询结果中更新数据
  4. 阿里云多机部署Fabric 1order节点多个peer节点
  5. SAP License:20个公司绝对不会告诉你的潜规则
  6. 万能Ghost全攻略(最详细完整的教程)
  7. 前端怎么通过后台来判断已读状态_微前端自检清单
  8. 小京东商城用什么版本的php,最新2018小京东多用户通用商城网源码商城带手机版ecshop源码程序...
  9. kuangbin专题 专题1 简单搜索
  10. 浏览器限制html5 audio.play()自动播放的问题
  11. flea-common使用之本地国际化实现
  12. M480 EMAC驱动02-IP101G测试
  13. 超声波风速风向传感器的测量原理
  14. NLP数据预处理与词嵌入
  15. 指纹识别实战——基于TensorFlow实现(文末送书)
  16. 输送FPGA人才,英特尔人才战略升级
  17. 深度学习设备购置RTX 2080Ti + i7 9700k+ Z390 A主板
  18. CTF-web暴力破解
  19. C语言02基础深入理解(二)
  20. power BI 天气数据爬取

热门文章

  1. python画猫和老鼠代码_猫捉老鼠游戏(Python)
  2. 自主创新进展制造世界主要轴承制作强国
  3. iOS 模仿系统的抖动动画
  4. CGT Asia 2022第二届亚洲细胞与基因治疗创新峰会将于2022年7月10日-111日在上海举办
  5. CSDN校园活动社开展“开学季活动”
  6. 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码
  7. 未来战争 计算机病毒,对计算机病毒攻击武器的新思考
  8. 【论文阅读】Realtime Robust Malicious Traffic Detection via Frequency Domain Analysis
  9. 我的世界无限贪婪服务器,《我的世界》1.12.2无尽贪婪mod
  10. 如何下载安装和使用 Office 2016的中文语言包?