动态规划——01背包

news2024/11/15 2:07:48

        背包问题经典资料背包九讲,可以上网查一下相关资料。

        下面的资料来自代码随想录和自己的一些个人理解,如有需要可以跳转代码随想录进行学习:代码随想录 (programmercarl.com)

        背包一共分为01背包,完全背包,多重背包,分组背包,和混合背包,下图来自代码随想录

01背包是有n件物品和一个最多能背重量为w 的背包。且每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

根据动态规划的一般步骤来解决一下并给出01背包的模板:

1.确定dp数组以及下标的含义

        定义dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大

2.确定状态转移方程

        对于每个物品,只有放或者不放两种可能,所以可得出:

        不放:dp[i][j] = dp[i - 1][j]

        放:       dp[i][j] = dp[i - 1][j - weight[i]] + value[i]

3.初始化

        从定义出发,容量j为0时,价值一定为0,即dp[i][0] = 0

        再看状态转移方程,i是从i-1推导而来,所以要考虑i=0时,是可以选取第0号物品的,所以当j>weight[0]时将dp[0][j] = value[0]

4.确定遍历顺序

        两种遍历顺序,先遍历物品或者先遍历容量,在01背包中可以,先遍历物品更好理解,需要注意一下的就是在完全背包中不同的遍历顺序的含义是不同的,后续再说吧。

5.举例推导验证一下

其次,背包问题的状态是可压缩的,我们可以将二维数组压缩成一维,对于递推公式:

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

我们将dp[i-1]那一层拷贝到dp[i]这一层,就可以将递推公式改为:

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

这样就可以只用一维数组,即滚动数组,重复利用上一层的数据即可

1.确定dp数组以及下标的含义

        定义dp[j] 表示容量为j的背包,所含物品的最大价值

2.确定状态转移方程

        对于每个物品,只有放或者不放两种可能,所以可得出:

        不放:dp[j] = dp[j]

        放:       dp[j] = dp[j - weight[i]] + value[i]

3.初始化

        从定义出发,容量j为0时,价值一定为0,即dp[0] = 0

4.确定遍历顺序

        这里只能先遍历物品,然后再遍历背包容量,而且背包容量必须从大到小枚举,这样是为了保证每个物品只被放入一次。

思考一下,如果正序遍历,假设物品0重量weight[0] = 1,价值value[0] = 15,

dp[1] = dp[1 - weight[0]] + value[0] = 15

dp[2] = dp[2 - weight[0]] + value[0] = 30

可以发现物品0是被使用了两次,但是从逆序开始遍历,则是

dp[2] = dp[2 - weight[0]] + value[0] = 15 

dp[1] = dp[1 - weight[0]] + value[0] = 15

因为倒序遍历能保证之前的状态是没有被使用的,而二维数组每次是由上一层推导来的,不会被同一层的状态影响

       然后就是为什么只能先遍历物品呢?假如先遍历容量,假设有物品0 weight[0] = 1,价值value[0] = 5,物品1 weight[1] = 2,价值value[1] = 10,

可以发现第一次dp[3] = dp[3 - 1] + 5 = 5, 第二次dp[3] = dp[3 - 2] + 10 = 10,而前面的状态都是还没确定的,因为我们是逆序遍历容量,那么这样每个背包其实就只放入了一个物品,当然是错的。

5.举例推导验证一下

423. 采药 - AcWing题库

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。

为此,他想拜附近最有威望的医师为师。

医师为了判断他的资质,给他出了一个难题。

医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

如果你是辰辰,你能完成这个任务吗?

输入格式

输入文件的第一行有两个整数 T 和 M,用一个空格隔开,T 代表总共能够用来采药的时间,M 代表山洞里的草药的数目。

接下来的 M 行每行包括两个在 11 到 100100 之间(包括 11 和 100100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出格式

输出文件包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

数据范围

1≤T≤1000,
1≤M≤100

输入样例:

70 3
71 100
69 1
1 2

输出样例:

3

思路:典型的01背包问题,每个草药只能采一次,花费时间相当于所占容量,按套路来即可

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int V, n;
int v[N], w[N], dp[N];

int main()
{
    scanf("%d%d", &V, &n); 
    for(int i = 0; i < n; i ++ ) scanf("%d%d", &v[i], &w[i]);
    
    for(int i = 0; i < n; i ++ )
        for(int j = V; j >= v[i]; j -- )
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
    
    
    printf("%d\n", dp[V]);
    
    return 0;
}

1024. 装箱问题 - AcWing题库

1022. 宠物小精灵之收服 - AcWing题库

278. 数字组合 - AcWing题库

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

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

相关文章

leetcode:70. 爬楼梯

一、题目 函数原型&#xff1a;int climbStairs(int n) 二、思路 此题运用递归思想。当只有1个台阶&#xff0c;那么只有1种方法爬到楼顶——跨一个台阶&#xff1b;当有2个台阶时&#xff0c;有2种方法爬到楼顶——跨一个台阶跨两次或直接跨两个台阶。当有3个台阶或更多台阶时…

实现客户端pineline的思路

背景&#xff1a; redis集群不支持客户端的mget操作&#xff0c;但是业务上对这个redis集群的批量操作的需求一直都在&#xff0c;所以有各种客户端实现了各式各样的pineline实现,本文就记录下我们公司的实现方式 pineline实现思路 1.pineline要快 pineline之所以快是因为可…

深度学习训练过程可视化工具

1.深度学习网络结构画图工具 地址&#xff1a;https://cbovar.github.io/ConvNetDraw/ 2.caffe可视化工具 输入&#xff1a;caffe配置文件 输出&#xff1a;网络结构 地址&#xff1a;http://ethereon.github.io/netscope/#/editor 3.深度学习可视化工具Visual DL Visual D…

数据变换:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

【毕设选题】flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

【python手写算法】numpy实现简易神经网络和反向传播算法【1】

import numpy as npdef dense(A,W):Znp.matmul(A,W)#矩阵乘法return 1/(1np.exp(-Z))if __name__ __main__:leanring_rate100Anp.array([[200.0,17.0]])# Wnp.array([[1,-3,5],# [-2,4,-6]])# bnp.array([[-1,1,2]])W1 np.array([[0., -10, 4],[-1,3,2]])W2np.ar…

数学建模__非线性规划Python实现

使用到的是scipy库 线性规划指的是目标模型均为线性&#xff0c;除此以外的都是非线性规划&#xff0c;使用scipy提供的方法对该类问题进行求解。 from scipy.optimize import minimize import numpy as np#定义目标函数 def fun(args):a,b,c,d argsv lambda x: (ax[0])/ (b…

免费和开源的机器翻译软件LibreTranslate

什么是 LibreTranslate &#xff1f; LibreTranslate 免费开源机器翻译 API&#xff0c;完全自托管。与其他 API 不同&#xff0c;它不依赖于 Google 或 Azure 等专有提供商来执行翻译。它的翻译引擎由开源 Argos Translate 库提供支持。 这个软件在 2022 年 3 月的时候折腾过&…

Vue 3的革命性新特性:深入了解Composition API

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数据结构与算法——8.二分查找

这篇文章我们来讲一下数据结构与算法中的二分查找 目录 1.介绍 1.1背景介绍 1.2算法介绍 2.实现 3.几个问题 4.算法改进 4.1左闭右开版 4.2 平衡版 4.3 Leftmost版 4.4 Leftmost返回 i 版 5.小结 1.介绍 首先&#xff0c;我们来介绍一下二分查找 1.1背景介绍 需…

Marmof:AI写作助手文章内容生成器工具

【产品介绍】 名称 Marmof 具体描述 Marmof是一个AI驱动的写作平台&#xff0c;可以帮助你快速创建原创、无抄袭的网站、邮件、广告和博客内容。每月提供5000字的免费额度&#xff0c;永久有效。拥有超过49种强大的工具&#xff0c;可以为各种平台生成吸引人的内容…

界面组件DevExpress WinForms v23.1亮点 - 全新升级HTML CSS模板

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

Jupyter杂症二:目录不显示或展示不全

文章目录 序言一、问题表象二、解决及思考 有些问题&#xff0c;解法还真的是莫名其妙&#xff0c;就如同拍了一下电视机就好了。。。。。难道是在拍的时候&#xff0c;我们传了内力给了计算机&#xff1f; 序言 一、问题表象 二、解决及思考 用鼠标按住左键&#xff0c;在空…

vim,emacs,verilog-mode这几个到底是啥关系?

vim&#xff1a;不多说了被各类coder誉为地表最强最好用的编辑器&#xff1b;gvim&#xff0c;gui vim的意思&#xff1b; emacs&#xff1a;也是一个编辑器&#xff0c;类似vscode&#xff1b; vim在使用的时候为了增强其功能&#xff0c;有好多好多插件&#xff0c;都是以.…

Brother CNC联网数采集和远程控制

兄弟CNC IP地址设定参考&#xff1a;https://www.sohu.com/a/544461221_121353733没有能力写代码的兄弟可以提前下载好网络调试助手NetAssist&#xff0c;这样就不用写代码来测试连接CNC了。 以上是网络调试助手抓取CNC的产出命令&#xff0c;结果有多个行string需要自行解析&…

应用商店备案登记流程解析

​ 引言&#xff1a; 随着智能手机的普及和移动互联网的发展&#xff0c;移动应用程序&#xff08;App&#xff09;已成为人们日常生活中不可或缺的一部分。在开发一个App之后&#xff0c;开发者需要将其上传到应用商店进行审核和上架。然而&#xff0c;在上架之前&#xff0…

【云计算】虚拟私有网络 VPC

虚拟私有网络 VPC 1.VPC 简介1.1 VPC 相关基本概念1.2 其他相关基本概念 2.VPC 通信场景2.1 VPC 内部互通2.2 VPC 间互通2.2.1 对等连接2.2.2 Transit Gateway 或者云联网 2.3 访问 Internet2.3.1 Internet 网关2.3.2 NAT 网关 2.4 访问本地网络2.4.1 VPN 连接2.4.2 专线接入2.…

完美的分布式监控系统 Prometheus与优雅的开源可视化平台 Grafana

1、之间的关系 prometheus与grafana之间是相辅相成的关系。简而言之Grafana作为可视化的平台&#xff0c;平台的数据从Prometheus中取到来进行仪表盘的展示。而Prometheus这源源不断的给Grafana提供数据的支持。 Prometheus是一个开源的系统监控和报警系统&#xff0c;能够监…

ChatGPT在职业规划中的智能助手

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为我们日常生活的一部分。ChatGPT作为一种智能语言模型&#xff0c;可以在职业规划中充当智能助手的角色。本文将探讨ChatGPT在职业规划中的应用&#xff0c;以及它如何成为未来工作的智能伙伴。 首先…

69、Spring Data JPA 的 @Query查询 和 命名查询

Query查询 和 命名查询的区别&#xff1a; 命名查询与直接用Query来定义查询的本质是一样&#xff0c;只不过它们定义SQL或JPQL语句的位置不同。 直接用 Query来定义查询 &#xff0c;写SQL或JPQL语句的位置在 DAO 组件&#xff0c; 命名查询&#xff0c;写SQL或JPQL语句的位置…