【动态规划】01背包问题(c++代码逐句分析)
01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题。如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些简单练习后再回过头来看这篇博客学习01背包问题。(要回来看哦!)
当了解了基础知识后回过头来看01背包问题,我们会发现问题中最难理解的就是状态转移方程的逻辑(亲身经历,说多了都是泪 ),所以笔者会在下文详细解释。
好了,废话不多说了,先上题!!!
**01背包问题**
有 N 件物品和一个容量是 M 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。输入格式
第一行两个整数,N,M,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式
输出一个整数,表示最大价值。数据范围
0<N,M≤1000
0<vi,wi≤1000
题目其实很好理解,通俗一点讲就是:你有一个容积为M的背包,房间里有N个体积和价格分别为v1,w1;v2,w2;…;vn,wn的宝物,请问你能最多带走多少钱的宝物呢?(是不是题目一下就好理解啦?)
那么重头戏来了,上代码!!!
#include<iostream>
#include<cmath> //后面要用到max函数
using namespace std;
int v[1001], w[1001]; //v,w分别用来储存第i个物体的体积与价值,
int dp[1001][1001]; //dp[i][j]的含义:你有容积为j的背包,然后要从第1个到第j个物体中选出 背包装得下的 价值和最大的 所有物体的价值和
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) //输入{cin >> v[i] >> w[i];}for (int i = 1; i <= n; i++) //依次找出从第1个物体到第i个物体的最大价值和{for (int j = 0; j <= m; j++) //求从第1个物体到第i个物体的 总价值不超过背包容量j的 最大总价值/*注意:这里求出背包容量从0到m的最大总价值是有意义的!后面状态转移方程的递推时要用到*/{dp[i][j] = dp[i - 1][j]; //不选第i个物品的最大值if (j >= v[i]) //只有j>=v[i]的情况下你才能选第i个物品,否则哪怕只选这一个物体,容量为j的背包也放不下{dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i]] + w[i]);/*分析:1、dp[i - 1] [ j - v[i] ]代表:你有容积为j-v[i]的背包,然后要从第1个到第i-1个物体中选出 背包装得下的 价值和最大的 所有物体的价值和2、因为只有找到从第1个到第i-1个、容积不超过( j - v[i]) 的背包能装下的 价值和最大的 所有物体的价值和后,把背包扩容为j再加上第i个物体的体积v[i]才能100%保证扩容后的背包能装的下3、最后要用max函数比较一下,看看选第i个的情况和不选第i个的情况哪个的价值和大,谁大dp[i][j]就存下谁*/}}}cout << dp[n][m]; //输出:你有容积为n的背包,然后要从第1个到第m个物体中选出 背包装得下的 价值和最大的 所有物体的价值和return 0;
}
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例
8
到这里,笔者对01背包问题的思路就全介绍完啦,代码分析部分可能会有点乱,要是看不懂可以私信笔者哦!
作者:Avalon Demerzel,是个正在不断努力学习的小白,如果觉得博客不错,就来个三连吧(点个赞也行)。让我们一起进步。
【动态规划】01背包问题(c++代码逐句分析)相关推荐
- 代码随想录算法训练营day41 | 动态规划 01背包问题基础 01背包问题之滚动数组
day41 01背包问题基础 问题描述 举个栗子 二维dp数组01背包 1.确定dp数组以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 01背包问题之 ...
- 动态规划之0-1背包问题(详解+分析+原码)
⭐️前面的话⭐️ 本篇文章将介绍算法专题之动态规划中的背包问题,更准确的说是背包问题中最简单的一种类型,即0-1背包问题,就是给你一定容量的背包和若干物品,每种物品只能选一次,告诉你每件物品的价值和体 ...
- 动态规划—01背包问题
原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...
- 动态规划——0-1背包问题
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...
- 动态规划——01背包问题 看此一篇文章就够了
本文讲述经典算法--动态规划的 常见问题 01背包 一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...
- 动态规划---01背包问题(2种方法)
一.动态规划 代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法 本质:递推,核心是找到状态转移的方式,写出dp方程. 解决问题:交叉,重叠子问题(最优子问题) 形式 ...
- 详解动态规划01背包问题--JavaScript实现
对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...
- 动态规划--01背包问题详解
代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...
- 动态规划 01 背包问题
01 背包问题 01 背包问题是很典型的 动态规划问题 问题描述 : 现在有N件商品, 他们的重量和价值分别为 Wi 和Vi 但是你的包最大承受重量是E 现在要那你求出 方案中价值最大是多少 ...
最新文章
- QIIME 2教程. 13训练特征分类器TrainingFeatureClassifiers(2021.2)
- SAP MM ME1P查询采购订购订单价格历史
- c 一般处理程序 ajax,Ajax调用一般处理程序数据
- JavaScript中OOP——面向对象中的继承/闭包
- JavaScript中的位置协议属性
- Layui--颜色选择器layui.colorpicker
- centos7从有线切换到无线_不需要软件,如何简单实现内外网自由切换?
- SQL执行效率2-执行计划
- JS获取屏幕的宽度、高度
- 逆向爬虫11 selenium基础
- Win10家庭中文版( 连接远程桌面要求的函数不受支持、这可能是由于 CredSSP 加密 Oracle 修正 )
- FileZilla 服务器 报Warning: FTP over TLS is not enabled, users cannot securely log in.
- Android PNG图片像素检测及剪裁优化
- 电脑录制的音频文件如何转换为MP3格式
- windows7 64位系统安装CPU版本TensorFlow(anaconda3.6)
- mysql hy000 2013_MySQL ERROR 2013 (HY000)错误解决方法
- 物流配送系统源码,货物运送行进轨迹“一清二楚”
- 菜鸟获取CSDN积分技巧
- K60将应用程序改建成库.a
- 浅析安全反序列化漏洞