背包模型——AcWing 423. 采药

news2025/1/13 13:45:20

背包模型

定义

背包模型是一种常见的算法问题模型,它主要涉及将一些物品放入一个容量有限的背包中,以达到某种最优目标,如最大化价值或最小化重量等。

运用情况

常用于资源分配、项目选择、货物装载等实际问题中。例如,在选择要携带哪些物品进行旅行时,考虑物品的价值和重量以及背包的容量限制;或者在一些项目投资决策中,根据项目的收益和成本以及可用资金来进行最优选择。

注意事项

  • 要明确物品的属性(价值、重量等)和背包的容量限制。
  • 注意边界情况的处理,避免出现错误。
  • 对于不同的约束条件和目标函数,需要选择合适的算法和策略。

解题思路

  • 确定问题的状态,通常是背包的剩余容量和已选择的物品。
  • 根据状态转移方程来计算最优解。
  • 可能需要遍历所有物品和背包容量的不同情况来找到最终答案。

例如,假设有 3 个物品,重量分别为 2、3、4,价值分别为 3、4、5,背包容量为 5。那么通过逐步分析每个物品是否放入背包,来找到能使背包内价值最大的组合。

核心思想

  1. 一是在有限的资源(背包容量)约束下,通过对不同物品(具有一定的价值和占用一定的资源量)进行合理的选择和组合,以实现某种特定的最优目标,如价值最大化、利益最大化等。它强调了在资源有限的情况下做出最优决策的重要性。例如,在给定背包容量的情况下,要决定选择哪些物品放入背包才能使总价值达到最大。
  2. 二是通过分析不同物品的属性以及它们与背包容量的关系,来确定最佳的选择策略。这可能涉及到对每个物品的价值和资源占用进行权衡,以及考虑不同物品组合带来的效果。比如,可能需要比较选择某个物品所带来的价值增加与占用背包容量的代价,以决定是否将其放入背包。
  3. 三是运用动态规划等算法思想来高效地求解问题。通过逐步构建最优解的过程,从简单的情况逐步推导出复杂的情况,从而找到全局的最优解。举例来说,通过计算前几个物品在不同容量下的最优解,为后续物品的选择提供依据,逐步得到整个问题的最优解。

背包问题变体

  1. 0-1 背包问题:这是最基本的背包问题,每个物品只能选择一次,要么放入背包,要么不放入背包。
  2. 完全背包问题:在这个变体中,每个物品可以被无限次地选择放入背包。
  3. 多重背包问题:每个物品都有一个有限的数量,并且可以被选择多次,但不能超过其数量限制。
  4. 有界背包问题:每个物品的价值和重量都有上下界限制。
  5. 分数背包问题:物品可以被分割成任意部分,并且每个部分都有相应的价值和重量。
  6. 多维背包问题:将背包问题扩展到多个维度,例如考虑背包的体积、重量等多个因素。
  7. 动态背包问题:背包的容量或物品的数量在问题求解过程中是动态变化的。
  8. 随机背包问题:物品的价值或重量是随机的,需要考虑概率因素。
  9. 带约束的背包问题:除了背包容量的限制外,还有其他约束条件,如物品之间的兼容性、背包的数量限制等。
  10. 目标优化背包问题:除了最大化背包中物品的总价值外,还可以考虑其他目标,如最小化背包的重量、最大化物品的数量等。

AcWing 423. 采药

题目描述

423. 采药 - AcWing题库

运行代码

#include <iostream>
#include <vector>
using namespace std;
int maxValue(int T, int M, vector<int>& times, vector<int>& values) {
   vector<vector<int>> dp(M + 1,vector<int>(T + 1, 0));
    for (int i = 1; i <= M; i++) {
        for (int t = 1; t <= T; t++) {
            if (times[i - 1] <= t) {
                dp[i][t] = max(dp[i - 1][t], dp[i - 1][t - times[i - 1]] + values[i - 1]);
            } else {
                dp[i][t] = dp[i - 1][t];
            }
        }
    }
    return dp[M][T];
}
int main() {
    int T, M;
    cin >> T >> M;
    vector<int> times(M);
    vector<int> values(M);
    for (int i = 0; i < M; i++) {
        cin >> times[i] >> values[i];
    }
    int result = maxValue(T, M, times, values);
    cout << result << endl;
    return 0;
}

代码思路

  • maxValue函数:

    • 创建一个二维的 dp数组来进行动态规划计算。
    • 通过两个嵌套的循环遍历所有可能的草药(i从 1 到 M)和时间(t从 1 到 T)。
    • 对于每个草药和当前时间,如果当前草药的采摘时间小于等于当前可用时间,就比较不采摘该草药(即 dp[i-1][t])和采摘该草药后用剩余时间去获取其他草药价值加上该草药本身价值(即 dp[i-1][t-times[i-1]]+values[i-1]),取较大值更新 dp[i][t];如果采摘时间超过了可用时间,就直接继承上一轮该时间点的价值(即 dp[i-1][t])。
    • 最后返回 dp[M][T],也就是在给定时间和草药情况下能获得的最大总价值。
  • main函数:

    • 输入总的可用时间 T和草药的数量 M
    • 创建两个向量分别用于存储每个草药的采摘时间和价值。
    • 通过循环读取每个草药的具体信息。
    • 调用 maxValue函数计算并得到结果,最后输出。

其它代码

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
int f[N];

int main()
{
    cin >> m >> n;
    
    for(int i = 0; i < n; i ++ )
    {
        int v, w;
        cin >> v >> w;
        
        for(int j = m; j >= v; j -- ) 
            f[j] = max(f[j], f[j - v] + w);
    }
    
    cout << f[m] << endl;
    
    return 0;
}

代码思路

  • 定义了一个常量 N 用于表示一些固定的规模。
  • 有两个变量 n 表示物品的数量,m 表示背包的容量。
  • 定义了一个数组 f[N] 用于进行动态规划计算。
  • 在 main 函数中:
    • 首先输入背包容量 m 和物品数量 n
    • 然后通过一个循环依次输入每个物品的价值 v 和重量 w
    • 对于每个物品,再通过一个内层循环从背包容量 m 开始倒序遍历到当前物品的价值 v。在这个过程中,不断更新 f[j],即判断当前背包容量为 j 时,不选该物品(即保持 f[j] 不变)和选择该物品(即 f[j - v] + w)哪种情况能得到更大的价值,取最大值更新 f[j]。这样就实现了在每个阶段根据已有的选择来确定最优的当前选择。
    • 最后输出背包容量为 m 时对应的最大价值,也就是 f[m]

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

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

相关文章

一次性掌握openlayers和cesium两个地图开发框架

又到一年毕业季&#xff0c;选择就业的同学&#xff0c;如果还没拿到offer&#xff0c;就要开始准备秋招了。 如果想找webgis相关的岗位&#xff0c;可以通过招聘信息&#xff0c;了解到企业的具体要求。其中&#xff0c;openlayers和cesium有多重要就不用我多说了。 掌握这两…

AI对职场的整顿

普通人离AI还有几年缓冲区&#xff0c;但早点做准备总是好的 AI淘汰的始终是跟不上时代的人。 现在很多公司都有AI培训&#xff0c;不仅GPT&#xff0c;还有Midjourney、Stable DIffusion等一系列AI工具。 像我们公司虽然今年招的少&#xff0c;但也会对新招的应届生统一进行…

VSCode运行前端项目-页面404

背景&#xff1a; 通过VSCode运行前端本地项目&#xff0c;运行成功后打开本地链接&#xff1a;http://1x.xxx.x.xxx:9803/ &#xff0c;发现打开的页面重定向到404&#xff1a;http//1xx.xxx.x.xxx:9803/404&#xff1b; 并且控制台出现&#xff1a;Failed to load resource: …

邮件自动推送技术如何实现?有哪些优劣势?

邮件自动推送怎么设置&#xff1f;如何评估邮件自动推送的效果&#xff1f; 邮件自动推送是一种高效的电子邮件营销和通信技术&#xff0c;它能够根据预设条件自动发送邮件给特定的收件人。AokSend将深入探讨邮件自动推送技术的实现原理和注意事项。 邮件自动推送&#xff1a…

Java露营基地预约小程序预约下单系统源码

轻松开启户外探险之旅 &#x1f31f; 露营热潮来袭&#xff0c;你准备好了吗&#xff1f; 随着人们对户外生活的热爱日益增加&#xff0c;露营已成为许多人周末和假期的首选活动。但你是否曾因找不到合适的露营基地而烦恼&#xff1f;或是因为繁琐的预约流程而错失心仪的营地…

手持小风扇品牌有哪些?分享口碑最好的五款手持小风扇

手持小风扇在炎热的夏季成为了许多人解暑的好帮手。它们不仅轻便便携&#xff0c;随时随地都能为我们带来清凉和舒适。然而&#xff0c;市场上手持小风扇的品牌繁多&#xff0c;让人眼花缭乱。为了帮助大家做出更明智的选择&#xff0c;接下来我们将分享口碑最好的五款手持小风…

Inventory Plus - Customizable Inventory System

InventoryPlus是一个直观而强大的工具,可以简化自定义库存、箱子和拾取的创建。该资产主要针对鼠标和键盘设计,但也支持游戏手柄。InventoryPlus可以处理您能想到的所有库存操作(如使用、装备、排序、丢弃等) 它通过调整TriggerAreas、PickUp和Chests的碰撞器类型,适用于3…

PPT录屏怎么录?PPT录屏,3种方法简单操作

在数字化时代&#xff0c;PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是商务报告、教学课件还是产品展示&#xff0c;PPT都能帮助我们更加生动、直观地传递信息。然而&#xff0c;有时候我们会面临PPT录屏怎么录的问题。这时&#xff0c;一个好的PPT录屏功能…

宝兰德受邀出席华为开发者大会2024,携手共绘基础软件新篇章

6月21日-23日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;在东莞松山湖举行&#xff0c;作为全球开发者的年度盛会&#xff0c;本次大会汇聚了众多业界精英与前沿技术。华为分享了HarmonyOS、盘古大模型、昇腾AI云服务、GaussDB数据库、自研仓颉编程语言等最新…

Streamer-Sales:开源数字人直播带货系统

Streamer-Sales 支持通过上传产品&#xff0c;一键生成带货话术&#xff0c;支持 RAG&#xff0c;支持文字转语音&#xff0c;支持基于 ComfyUI 合成虚拟人视频&#xff0c;可以直接在线体验&#xff0c;目前效果不是特别好&#xff0c;算是迈出第一步

Vue2中为啥不用 Object.defineProperty 实现响应式数组 ? 不能监听到数组变化吗?

Vue2.0 对于数据响应式的实现上是有一些局限性的&#xff0c;比如&#xff1a; 无法检测数组和对象的新增&#xff1b; 无法检测通过索引改变数组的操作&#xff1b; 针对以上问题&#xff0c;我们一般都会把锅甩给 Object.defineProperty。所以&#xff0c;在Vue 3.0 中&am…

RAG应用要如何吃到大模型长上下文的红利?-LongRAG

去年底的时候&#xff0c;笔者写过&#xff0c;与其在RAG系统上雕花&#xff0c;可以重新思考一下&#xff0c;自己的业务场景是否非RAG不可吗&#xff1f;随着去年大模型的蓬勃发展&#xff0c;长度外推、更长的上下文模型&#xff0c;更厉害的中文底座大模型&#xff0c;都可…

java版本ERP管理系统源码 Spring Cloud erp系统-更专业的ERP管理系统

ERP&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划&#xff09;软件是一种集成的管理平台&#xff0c;它将企业的所有业务流程&#xff0c;包括采购、销售、库存、财务等&#xff0c;整合到一个统一的系统中。这种整合不仅提高了工作效率&#xff0c;还增强…

‘pip‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

如何级联移位寄存器(74HC595)

在这个项目中&#xff0c;我们将使用 74HC595 移位寄存器将 2 个移位寄存器级联在一起。这样级联移位寄存器现在可以控制 16 个输出。 当然您可以级联任意数量的移位寄存器。如果您要级联第三个移位寄存器&#xff0c;它可以控制 24 个输出。如果您级联第四个移位寄存器&#x…

# Kafka_深入探秘者(1):初识 kafka

Kafka_深入探秘者&#xff08;1&#xff09;&#xff1a;初识 kafka 一、kafka 特性 1、Kafka &#xff1a;最初是由 Linkedln 公司采用 Scala 语言开发的一个多分区、多副本并且基于 ZooKeeper 协调的分布式消息系统&#xff0c;现在已经捐献给了 Apache 基金会。目前 Kafka…

职升网:环评师考试成绩查询时间分享!

成绩查询时间 根据多个省市地区发布的2024年环境影响评价工程师的报名通知&#xff0c;预计2024年环境影响评价工程师考试成绩的查询时间将在2024年7月下旬开启。 成绩合格标准 2024年环境影响评价师考试的合格标准如下&#xff1a; 环境影响评价相关法律法规&#xff1a;科…

基于Python/MNE处理fnirs数据

功能性近红外光谱技术在脑科学领域被广泛应用&#xff0c;市面上也已经有了许多基于MATLAB的优秀工具包及相关教程&#xff0c;如&#xff1a;homer、nirs_spm等。而本次教程将基于Python的MNE库对fNIRS数据进行处理。 本次教程基于&#xff1a;https://mne.tools/stable/auto_…

Vue3 按钮根据屏幕宽度展示折叠按钮

文章目录 一、组件封装二、使用三、最终效果(参考)四、参考 一、组件封装 ButtonFold.vue 1、获取父组件的元素&#xff0c;根据元素创建动态插槽 2、插槽中插入父元素标签。默认效果和初始状态相同。 3、当屏幕宽度缩小时&#xff0c;部分按钮通过 dropdown 的方式展示出来&a…

APT 组织也在利用云存储进行攻击

研究人员发现&#xff0c;各类攻击者都在攻击行动中将恶意脚本、远控木马和诱饵文档等恶意文件上传到云服务器上&#xff0c;各种恶意文件组合起来完成恶意攻击。 某个攻击组织从发送钓鱼邮件到植入远控木马的过程如下所示&#xff1a; 攻击链 多个恶意文件串联起了整个攻击行…