动态规划-01背包问题
大佬整理的理解链接:(建议先看一遍自行理解DP思想再去看代码)
动态规划之01背包问题 - kkbill - 博客园01背包问题 问题描述: 给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总https://www.cnblogs.com/kkbill/p/12081172.html
思路
DP算法核心思想: 过利用已有的子问题信息高效求出当前问题的最优解。
f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少。
result=max(f[n][0~v])
f[i][j]:
(1)、不选第i个物品,f[i][j]=f[i-1][j];
理解:不选第i个物品有两种情况:
a. 体积不够
b. 不是最优解,即f[i-1][j]为优解
( 2)、选择第i个物品,f[i][j]=f[i-1][j-v[i]]+w[i]
理解:这里用到了以前已经解决了的子问题,即f[i-1][j-v[i]]的最优解
eg:新加的物品体积为2,价值为4,假设体积够装,则f[i][j]=max(f[i-1][j-2]+4,f[i-1][j])
如果体积不够装,则f[i][j]=f[i-1][j]
f[j]:
状态转移方程为:f[j] = max(f[j], f[j - v[i]] + w[i]) 。(我在题目中用f1[N]来表示优化后的一维数组)需要注意的是,一维版本需要逆序求最大值,即从j=m开始,防止数据被覆盖污染
代码:
#include<iostream>
#include<algorithm>
using namespace std;const int N=1010;int n,m;
int f[N][N]; //i个物品在总体积小于等于j的情况下可以获得的最大价值
int v[N],w[N]; //分别表示第i个物品的体积和价值
int f1[N]; //优化的一维版数组 //二维版
int main()
{cin>>n>>m; //背包里有n个东西,能装的物品的体积总和不超过mfor(int i=1;i<=n;i++) cin>>v[i]>>w[i]; //全局变量初始值默认为0,此步骤可省略for(int i=1;i<=n;i++)for(int j=0;j<=m;j++){//不选择第i个物品f[i][j]=f[i-1][j];//选择第i个物品if(j>=v[i]) //当前背包的体积可以装下第i个物品{f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);} } //f[n][m]即为最大值 cout<<f[n][m];} //优化--一维版
int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++)for(int j=m;j>=v[i];j--)f1[j]=max(f1[j],f1[j-v[i]]+w[i]);cout<<f1[m];return 0;
}
动态规划-01背包问题相关推荐
- 动态规划—01背包问题
原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...
- 动态规划——0-1背包问题
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...
- 动态规划——01背包问题 看此一篇文章就够了
本文讲述经典算法--动态规划的 常见问题 01背包 一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...
- 动态规划---01背包问题(2种方法)
一.动态规划 代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法 本质:递推,核心是找到状态转移的方式,写出dp方程. 解决问题:交叉,重叠子问题(最优子问题) 形式 ...
- 动态规划01背包问题入门学习,详细笔记,推荐阅读
问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...
- python实现动态规划0-1背包问题
一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...
- 详解动态规划01背包问题--JavaScript实现
对其他动态规划问题感兴趣的,也可以查看 详解动态规划最少硬币找零问题--JavaScript实现 详解动态规划最长公共子序列--JavaScript实现 一开始在接触动态规划的时候,可能会云里雾里,似 ...
- 动态规划--01背包问题详解
代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...
- 1.动态规划--01背包问题
动态规划 DP问题思考时候分成两大部分考虑 1. 状态表示 f(i,j) (1) 集合:(所有选法的集合) 所有选法 条件: 1.从前i个物品中选 2. 总体积m<=j (2) 属性 最大值.最 ...
最新文章
- PNG透明兼容IE6的几种方法
- 运算放大器在超高频信号作用下的偏移量的变化
- 渣男劈腿,两个女生逼他做出选择,结果......
- 传值类型_Java内存管理:Stackoverflow问答-Java是传值还是传引用(十一)
- dataframe scala 修改值_【Spark学习笔记】 Scala DataFrame操作大全
- 了解SQL Server事务日志备份和完整备份的日志序列号
- 面对亚马逊和谷歌的争夺战,小企业该如何生存?
- Mac怎么合并文件夹
- Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
- CCS历代版本下载地址以及6.0以上版本添加软件仿真
- html js实现省市区联动调节下拉框菜单
- Discriminative Reasoning for Document-level Relation Extraction
- 怎么制作出一张证件照?分享几种好用的证件照制作方法
- 每日新闻:华为获首个微模块产品PUE测试证书;Linux发布Acumos AI开源架构平台;商汤技联手华侨城中学打造智能实验学校...
- 互联网音乐告别版权战,音乐社区或成新风口?
- 力天创见热区统计方案
- python-字符串补录
- muscle多序列比对简单应用
- 《程序原本-追溯程序原本之书》读书笔记
- springboot整合druid 监控sql
热门文章
- 有趣的物联网项目合集
- 平方和:在1-40中只要数字中含有2,0,1,9的数字一共有28个,他们的和是574,平方和是14362。请问1-2019中,所有这样的输的平方和是多少?
- ICP许可证申请误区一:我是创业型小公司,开发了一款APP,需不需要申请ICP许可证,该怎么办?
- 2023首届大学生算法大赛 - 拿饼干
- 计算机项目uniapp(毕设课设)之含文档+PPT+源码等]精品Uniapp+SSM的家庭客栈管理系统|酒店餐饮住宿订餐点餐
- Excel插件E灵:按家庭建表,创建一户一表。将明细表转成一户一表
- php判断中文字符长度,JavaScript_JS判断字符串长度的5个方法(区分中文和英文),目的:计算字符串长度(英文占 - phpStudy...
- Yale N. Patt教授的《计算机系统概论》
- 推荐5款免费的高清壁纸
- Visio 画甘特图