01背包问题:有n件物品,每一件物品的重量为 w[ i ],价值为 c[ i ]。现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,使得背包内物品的总价值最大,最大为多少?


如果采用暴力枚举法,每一件物品有两种选择:放入背包 / 不放入背包。因此 n 件物品有  种选择结果。时间复杂度为  太糟糕了。而是用动态规划问题可以大大降低时间复杂度!


1、算法分析

dp[ i ] [ j ] 表示在前 i 件物品中选取部分物品,能放入背包容量为 j (可以不装满)的最大价值(最优解)。其中:。那么如何求解最优解呢?下面考虑对第 i 件物品的选择策略:

情况1:j < w[ i ]

  • 不可能放入放第 i 件物品:那么问题就转化为前 i - 1 件物品恰好装入背包容量为 j 的最优解

情况2: j >= w[ i ]

  • 不放第 i 件物品:那么问题就转化为前 i - 1 件物品恰好装入背包容量为 j 的最优解
  • 放第 i 件物品:那么问题就转化为为前 i - 1 件物品恰好装入背包容量为 j - w[ i ] 的最优解 + c[ i ]

状态转移方程如下:

  1. 当 i = 0 或 j = 0(边界条件) :
  2. 当 

最终答案就储存在 dp[n][V] 中。


2、过程示例

对于n = 5, V = 10 的情况 :

最终的答案就是 dp[5][10] = 19


代码实现

#include <algorithm>
using namespace std;
#define MAXN 100
#define MAXV 100/* 01背包问题:有n件物品,没意见的物品重量为 w[ i ],价值为 c[ i ]。* 现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,* 使得背包内物品的总价值最大,最大为多少? */int fun(int n, int v, int w[], int c[]) {int dp[MAXN][MAXV] = {0};for (int i = 1; i <= n; i++)  //i为当前可选物品for (int j = 1; j <= v; j++) {  //j为最大容量if (w[i] > j)dp[i][j] = dp[i - 1][j];elsedp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + c[i]);}return dp[n][v];
}

3、时间复杂度分析

虽然说使用了动态规划,但是其实其理论上依旧是一个指数时间的算法。01背包问题是一个NP完全问题,至今未能找到指数时间的算法实现~


注意:《算法笔记》书上对dp数组的定义是 dp[ i ] [ j ] 表示在前 i 件物品中选取部分物品,能放入背包容量为 j (必须装满)的最大价值。本质区别就在于,讨论的情况是否装满!这个代码效率会高一点,但是理解起来有难度...还没想通...总觉得有点毛病..先不整理了(给自己挖个坑

背包DP | 01背包问题相关推荐

  1. 背包DP | 完全背包问题

    完全背包问题:有n种物品,每一件的物品重量为 w[ i ],价值为 c[ i ].现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,使得背包内物品的总价值最大,最大为多少?(每一 ...

  2. poj3624 Charm Bracelet DP 01背包问题

    题目链接:http://poj.org/problem?id=3624 01背包问题,接触DP的第一题. 1 ///2014.4.10 2 ///poj3624 3 4 #include <io ...

  3. java 0 1背包_浅谈java实现背包算法(0-1背包问题)

    0-1背包的问题 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总 ...

  4. 动态规划DP——01背包问题

    01 背包问题   今天在算法课上讲解了动态规划算法,其中讲到了01背包问题.这是一种典型的动态规划问题,于是下课之后我使用java进行了相对应的代码实现.动态规划求解具有以下的性质: 1.最优子结构 ...

  5. 背包DP | 找零钱问题

    找零钱问题:假设有一个出纳员手中有几种面值的硬币,要求他用最少的硬币数支付规定的现金.例如,现有3种硬币:它们的面值分别为1元.4元和6元.要支付8元. 找零钱问题可以使用贪心或完全背包来解决,但是用 ...

  6. c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:算法与编程之美 前言 对学算法的同学来说,动态规划是其 ...

  7. 0-1背包问题详解(DP分支限界回溯三种方法)

    0-1背包 将n个项目的权重和值,放入一个容量为W的背包中,得到背包中最大的总价值.换句话说,给定两个整数数组val[0..n - 1]和wt [0 . .n-1],分别表示与n个项目相关的值和权重. ...

  8. 01背包、完全背包、多重背包问题的C++实现及路径记录

    这里主要实现路径记录,只求最值问题移步 01背包.完全背包.多重背包问题的C++实现 以下均打印输出路径,即装入背包的物品序号,和最大值. 01背包问题 #include <iostream&g ...

  9. 01背包、完全背包、多重背包问题的C++实现

    01背包问题 容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2,3,4,5. 设计算法,实现背包内物品价值最大. 代码如下(输出14) #includ ...

最新文章

  1. 15 -Flask构建弹幕微电影网站-基于角色的访问控制
  2. firefox浏览器 插件--【维基百科+谷歌翻译】高级应用之 带图翻译
  3. linux ip别名和辅助ip地址
  4. 将keepalived添加到系统服务中
  5. 获取表单提交的数据getParameter()方法
  6. 虚拟主机选择php版本,虚拟主机的php用什么版本好
  7. Ribbon-4 Ribbon脱离Eureka使用
  8. excel实战应用案例100讲(十四)-Excel可直接分析的大数据语义层
  9. 各大媒体优劣对比_信息流投放广告丨各大平台的信息流都有什么特点与弊端
  10. sublime text 2 解决错误 [Decode error - output not utf-8]
  11. fiddler怎么过滤_Fiddler导出JMeter脚本插件详解
  12. api 文件长度_上传下载API
  13. 基于SSM的电脑商城
  14. IDEA 自定义主题
  15. 技术年货:美团技术沙龙合辑大放送
  16. 京郊经典路线之香八拉反穿游记
  17. 笔记-5:mysql数据更新
  18. javascript显示本地服务器图片,JavaScript图片本地预览功能的实现方法
  19. ssh备考-05Struts2 Action类下的重要API(原生Servlet的API、跳转配置、框架自身的数据封装、自定义拦截器)
  20. Validform表单验证时可以为空,否则按照指定的格式验证

热门文章

  1. TinyXML2使用总结
  2. Android 使用Messenger和Aidl实现跨进程通信
  3. tensorflow 搭建简单的卷积神经网络,输入二维数组完成分类
  4. 【Unity3D】Unity3D中Material与ShareMaterial引用的区别
  5. 游戏网站开发学习笔记(一)
  6. Python 使用摄像头测试心率 webcam-pulse-detector
  7. 【数模研赛】“华为杯”第十九届中国研究生数学建模竞赛C题分享——(三)问题一模型建立
  8. 2020年高教社杯全国大学生数学建模C题中小微企业信贷决策(Matlab代码)
  9. Mysql中实现全外连接
  10. 大数据“比你更懂你”,会有不怕失业的专业?