背包DP | 01背包问题
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 ]
状态转移方程如下:
- 当 i = 0 或 j = 0(边界条件) :
- 当
- :
- :
最终答案就储存在 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背包问题相关推荐
- 背包DP | 完全背包问题
完全背包问题:有n种物品,每一件的物品重量为 w[ i ],价值为 c[ i ].现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,使得背包内物品的总价值最大,最大为多少?(每一 ...
- poj3624 Charm Bracelet DP 01背包问题
题目链接:http://poj.org/problem?id=3624 01背包问题,接触DP的第一题. 1 ///2014.4.10 2 ///poj3624 3 4 #include <io ...
- java 0 1背包_浅谈java实现背包算法(0-1背包问题)
0-1背包的问题 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总 ...
- 动态规划DP——01背包问题
01 背包问题 今天在算法课上讲解了动态规划算法,其中讲到了01背包问题.这是一种典型的动态规划问题,于是下课之后我使用java进行了相对应的代码实现.动态规划求解具有以下的性质: 1.最优子结构 ...
- 背包DP | 找零钱问题
找零钱问题:假设有一个出纳员手中有几种面值的硬币,要求他用最少的硬币数支付规定的现金.例如,现有3种硬币:它们的面值分别为1元.4元和6元.要支付8元. 找零钱问题可以使用贪心或完全背包来解决,但是用 ...
- c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:算法与编程之美 前言 对学算法的同学来说,动态规划是其 ...
- 0-1背包问题详解(DP分支限界回溯三种方法)
0-1背包 将n个项目的权重和值,放入一个容量为W的背包中,得到背包中最大的总价值.换句话说,给定两个整数数组val[0..n - 1]和wt [0 . .n-1],分别表示与n个项目相关的值和权重. ...
- 01背包、完全背包、多重背包问题的C++实现及路径记录
这里主要实现路径记录,只求最值问题移步 01背包.完全背包.多重背包问题的C++实现 以下均打印输出路径,即装入背包的物品序号,和最大值. 01背包问题 #include <iostream&g ...
- 01背包、完全背包、多重背包问题的C++实现
01背包问题 容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2,3,4,5. 设计算法,实现背包内物品价值最大. 代码如下(输出14) #includ ...
最新文章
- 15 -Flask构建弹幕微电影网站-基于角色的访问控制
- firefox浏览器 插件--【维基百科+谷歌翻译】高级应用之 带图翻译
- linux ip别名和辅助ip地址
- 将keepalived添加到系统服务中
- 获取表单提交的数据getParameter()方法
- 虚拟主机选择php版本,虚拟主机的php用什么版本好
- Ribbon-4 Ribbon脱离Eureka使用
- excel实战应用案例100讲(十四)-Excel可直接分析的大数据语义层
- 各大媒体优劣对比_信息流投放广告丨各大平台的信息流都有什么特点与弊端
- sublime text 2 解决错误 [Decode error - output not utf-8]
- fiddler怎么过滤_Fiddler导出JMeter脚本插件详解
- api 文件长度_上传下载API
- 基于SSM的电脑商城
- IDEA 自定义主题
- 技术年货:美团技术沙龙合辑大放送
- 京郊经典路线之香八拉反穿游记
- 笔记-5:mysql数据更新
- javascript显示本地服务器图片,JavaScript图片本地预览功能的实现方法
- ssh备考-05Struts2 Action类下的重要API(原生Servlet的API、跳转配置、框架自身的数据封装、自定义拦截器)
- Validform表单验证时可以为空,否则按照指定的格式验证
热门文章
- TinyXML2使用总结
- Android 使用Messenger和Aidl实现跨进程通信
- tensorflow 搭建简单的卷积神经网络,输入二维数组完成分类
- 【Unity3D】Unity3D中Material与ShareMaterial引用的区别
- 游戏网站开发学习笔记(一)
- Python 使用摄像头测试心率 webcam-pulse-detector
- 【数模研赛】“华为杯”第十九届中国研究生数学建模竞赛C题分享——(三)问题一模型建立
- 2020年高教社杯全国大学生数学建模C题中小微企业信贷决策(Matlab代码)
- Mysql中实现全外连接
- 大数据“比你更懂你”,会有不怕失业的专业?