3分钟教你弄懂【01背包问题】

背包问题

介绍

将有限物品按找最大价值装进有限体积的背包中去

核心步骤

1.确定状态表示
2.确定边界遍历顺序
3.找到状态转移方程

先上 Coding

#include <iostream>
using namespace std;const int N = 300;
int itemSize[N];			//每件物品的大小(体积)
int itemValue[N]; 			//每件物品的价值
int dp[N][N];				//状态表示数组([物品序号][背包大小])
int m, n;					//m为背包体积 n为物品数量int main() {cin >> m >> n;for (int i = 1; i <= n; i++) {cin >> itemSize[i] >> itemValue[i];//依次输入每一件物品的体积和价值}for (int i = 1; i <= n; i++) {						//n物品数量for (int j = 1; j <= m; j++) { 					//m为背包体积if (itemSize[i] <= j) {//物品体积比j(背包容量)小,可以放进背包,取放和不妨两种情况价值Value的最大值dp[i][j] = max(dp[i-1][j], dp[i-1][j-itemSize[i]] + itemValue[i]);}else {//放不进去的情况dp[i][j] = dp[i-1][j];}}}cout << "dp数组:" << endl;for (int i = 0; i <= n; i++) {for (int j = 0; j <= m; j++) {cout << dp[i][j] << ' ';}cout << endl;}
}

手动遍历的结果

在这里插入图片描述

思路

  1. 首先遍历每一个物品
  2. 对每一个物品,遍历背包的大小
    对于每一种物品都有两种情况
  • 当前所遍历的背包大小放得下
  • 当前所遍历的背包大小放不下

    注意这里的背包指的是我们分解出来的子状态中的,是对于每一个物品,从0 ~ m(背包的大小),遍历了m+1个背包中的任意一种。

状态表示

dp[i][j]

  • i:表示从第1个物品i个物品这个范围
  • j:表示背包大小的一种可能性

边界

满足i==0 && j==0设置为 0

遍历顺序

遍历1~n物品,对每个物品遍历背包大小

状态转移方程

  • 如果拿不下

    dp[i][j] = dp[i-1][j]

  • 如果拿得下

    dp[i][j] = max(dp[ i - 1 ][ j ], dp[ i - 1 ] j-size[i]] + value[i])

解释一下这个转移方程中 max 内的两个参数:

  • dp[i-1][j] 表示这个除去这个物品(第 i 位物品)以外的0 ~ i-1个物品,也就是拿得下,但是你就是不拿这个物品的情况
  • dp[i-1][j - size[i]] + value[i]:这个式子由两个式子相加得来,左边的i-1依旧表示这个物品不拿,0 ~ i-1个物品的情况,j - size[i]表示拿了这个物品之后,剔除这个物品的背包大小的最优解,value[i]就表示这个物品的价值

剥离出来就是

  • dp[i-1][j]:除去这个物品,对应背包大小的最优解
  • j - size[i]:剔除这个物品的背包大小的最优解
  • value[i]:这个物品的价值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《仙剑7》登陆Xbox主机平台年末大作空窗期

首发一年后&#xff0c;《仙剑奇侠传7》终于登陆Xbox主机平台&#xff0c;而这也恰逢Xbox平台年末大作的窗口期。 随着年底大作的稀缺&#xff0c;以及海外3A RPG《星空》的延期&#xff0c;2022年底的这段时间给Xbox玩家体验《刀剑7》留下了一段空白。 可以说是因祸得福。 《仙…

天星数科以金融数字化转型为核心,提升服务实体经济质效

数字化转型是金融行业把握新一轮科技革命和产业变革新机遇的选择。去年召开的中央金融工作会议&#xff0c;将数字金融作为金融五篇文章之一&#xff0c;要求金融机构加快数字化转型&#xff0c;提高金融服务便利性和竞争力。天星数科全面贯彻新发展理念&#xff0c;以金融数字…

详解Python内建函数map()和reduce()

Python内建了map()和reduce()函数。 我们先看map。map()函数接收两个参数&#xff0c;一个是函数&#xff0c;一个是Iterable&#xff0c;map将传入的函数依次作用到序列的每个元素&#xff0c;并把结果作为新的Iterator返回。 现在&#xff0c;我们用Python代码实现&#xf…

【C语言】结构体详解

文章目录 1、前言2、结构体变量的创建和初始3、结构体的特殊声明3、结构体的自引用5、结构体的内存对齐5.1 对齐规则5.2 为什么存在内存对齐?5.3 修改对齐数 6、结构体实现位段6.1 什么是位段6.2 位段的内存分配6.3 位段的跨平台问题6.4 位段的应用6.5 位段使用的注意事项 7、…

春耕农业气象环境监测站来帮忙

春耕春种&#xff0c;是大地苏醒的序曲&#xff0c;是生机盎然的交响乐章。在这播种希望、耕耘未来的美好时节&#xff0c;{鸣乔电子科技}农业气象环境监测站犹如一位贴心的助手&#xff0c;为农业生产保驾护航。 随着科技的进步&#xff0c;农业气象环境监测站不再是简单的温…

前端必会的一些基础

1、如何把obj对象 添加到arr数组对象内 2、手机号、邮箱、隐藏用户手机号中间四位正则 3、两个数组 数组a未全部人员 数组b为已选中人员 默认选中 4、数组去重、 5、localStorage 存取 数组 方法 6、数据filter过滤 7、请求接口时header 请求格式不对 需要怎么转换&#xf…

电脑桌面便签软件,好用的电脑桌面便签工具

在数字化时代&#xff0c;我们的工作效率在很大程度上依赖于所选工具的优劣。优秀的工具能助力我们事半功倍&#xff0c;而低效的工具则可能导致我们陷入冗杂操作&#xff0c;白白耗费大量时间。在此&#xff0c;我要向大家推荐一款极为出色的电脑桌面便签软件--好用便签。 好…

java.lang.RuntimeException: java.lang.IllegalArgumentException

填上红框内容&#xff0c;亲测可行 报错如下&#xff1a; java: java.lang.IllegalArgumentException java.lang.RuntimeException: java.lang.IllegalArgumentExceptionat com.sun.tools.javac.main.Main.compile(Main.java:553)at com.sun.tools.javac.api.JavacTaskImpl.do…

【EPLAN】授权-MAX100.17问题解决

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决EPLAN 客户端授权连接时出现-MAX100.17 报错问题&#xff1b; 2、 问题场景 用于解决在EPLAN 客户端授权连接时&#xff0c;出现-MAX100.17 报错&#xff1a;无法建立与EPLAN Client Service[MAX 100.17] 的连…

【MATLAB源码-第9期】基于matlab的DQPSK的误码率BER和误符号率SER仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 DQPSK信号的解调与2DPSK信号的解调类似&#xff0c;也有两种方法&#xff0c;分别是极性比较法和相位比较法 极性比较法。其原理方框图如下图所示。由于DQPSK信号可以看做是两路2DPSK信号的合成&#xff0c;解 调时也可以分别…

Python:基础语法

一、import与from.....import 有时候我们需要使用一些第三方库或包时&#xff0c;我们就需要通过import或from.....import导入模块。 # 导入库 import sys print("hello,world") 当我们自己写了些函数&#xff0c;在其他py文件&#xff0c;我们也可以通过from.....im…

如何解析MySQL中的redolog日志?

解析MySQL中的redolog日志比解析binlog更为复杂&#xff0c;因为redolog是InnoDB存储引擎特有的&#xff0c;以物理格式记录数据库的更改&#xff0c;主要用于恢复未提交的事务和加速数据恢复。由于其物理和二进制的特性&#xff0c;redolog没有直接可读的SQL语句或简单的解析工…

Anaconda配置系统环境

首先&#xff0c;右键此电脑&#xff0c;点击属性 点击高级系统设计 点击环境变量 点击环境变量中系统环境下的Path&#xff0c;双击 如下图&#xff0c;添加这四项即可&#xff0c;注意&#xff0c;这都是Anaconda的安装目录下的内容 在windowsR的cmd情况下&#xff0c;输入co…

动归专题——斐波纳契模型和路径问题

前提 本专题开始&#xff0c;注重整理与动态规划相关的题目&#xff0c;从简单的动归开始切入&#xff0c;慢慢掌握和练习动态规划这一重要的算法思想&#xff0c;部分相对复杂的题目会结合画图和代码分析去解释 一、第N个泰波纳契数列 1.链接 1137. 第 N 个泰波那契数 - 力…

C# NumericUpDown 控件正整数输入控制

用到了控件的 KeyPress 和 KeyUp事件。 KeyPress 中控制输入“点、空格&#xff0c;负号”&#xff1b; KeyUp 中防止删空&#xff0c;以及防止输入超过最大值或最小值 。 private void nudStart_KeyPress(object sender, KeyPressEventArgs e){numericUpDownKeyPress(sender…

Python时间

UTC ~ 北京时间 【差8小时】 格式化日期时间为字符串:strftime 时间戳-1970.1.1到现在的秒数:time.time() AttributeError: partially initialized module ‘datetime’ has no attribute ‘fromtimestamp’ (most likely due to a circular import) 改正&#xff1a;文件名和…

如何与回避型依恋人格的人谈恋爱

先讲是什么。 有些人在恋爱中碰到对方比较冷淡&#xff0c;遇到矛盾爱回避就认为是回避型依恋&#xff0c;这肯定是不对的。事实上&#xff0c;每个人人性中都会有回避的一部分&#xff0c;当自身的情感需求不强时&#xff0c;面对过于沉重的爱或是无法解决的矛盾&#xff0c;…

合同起草、审查耗时费力?君子签智能电子合同让签署事半功倍

在合同签署过程中&#xff0c;着急和客户签约&#xff0c;却找不到合适的内容范本&#xff1f;法务审查合同只能逐字逐句审查&#xff0c;效率太慢&#xff1f;合同需要客户、法务、负责人等多方参与&#xff0c;修改内容难以一一对应&#xff1f;合同涉及的工资、费用、价格等…

私域裂变的10种玩法

1.邀请有礼 邀请有礼是一种常见且有效的拉新方式&#xff0c;通过福利诱饵&#xff0c;刺激老用户邀请新用户&#xff0c;实现用户快速扩张。 在私域中&#xff0c;这种方式也非常普遍&#xff0c;但需要成本&#xff0c;因此裂变成功的门槛需要设定。通常需要裂变对象完成消…

【NC16622】多项式输出

题目 多项式输出 模拟&#xff0c;注意细节 思路 一道模拟题&#xff0c;按要求模拟即可&#xff0c;没有算法上的难度&#xff0c;有的是动手的复杂性。这本来可以直接在主函数中写处理过程的&#xff0c;但是为了其更有通用性&#xff0c;在这里将其提取为一个函数&#xf…