背包模型——AcWing 423. 采药

背包模型

定义

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

运用情况

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

注意事项

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

解题思路

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

例如,假设有 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.mzph.cn/pingmian/35348.shtml

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

相关文章

AWS云中的VPC启用流日志保存S3(AWS中国云)

问题 需要在AWS中国云中对VPC启用流日志操作。 步骤 创建s3桶 这里设置一个s3桶名&#xff0c;创建即可。如果出现已存在具有相同名称的存储桶错误&#xff0c;就换个桶名再试一试吧。 启用vpc流日志 找到vpc流日志入口操作&#xff0c;如下图&#xff1a; 设置vpc流日志…

『亚马逊云科技产品测评』程序员最值得拥有的第一台专属服务器 “亚马逊EC2实例“

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 引言 自2006年8月9日&#xff0c;在搜索引擎大会&#xff08;SES San Jo…

嵌入式EMC

名词介绍&#xff1a; EMC&#xff1a;兼容&#xff0c;设备间相互兼容在共同环境下工作的能力。包括&#xff1a;EMI和EMS EMI&#xff1a;interference干扰&#xff0c;自身对其他设备的干扰 EMS&#xff1a;susceptibility抗干扰能力 EMS包含以下&#xff1a; 浪涌&…

Java文件操作小项目-带GUI界面统计文件夹内文件类型及大小

引言 在Java编程中&#xff0c;文件操作是一项基本且常见的任务。我们经常需要处理文件和文件夹&#xff0c;例如读取、写入、删除文件&#xff0c;或者遍历文件夹中的文件等。本文将介绍如何使用Java的File类和相关API来统计一个文件夹中不同类型文件的数量和大小。 准备工作…

c++基本数据类型和计算(三)习题讲解

1.【单选题】 int a450; int main() { int a100; { int a 999; std::cout << a; } } A.999 B.100 C.450 解析&#xff1a;这道题考察作用域&#xff0c;本身遵守就近原则&#xff0c;所以选A。 2.【单选题】 int a; { int b 100; } ab<&l…

MySQL 基础概念

MySQL逻辑架构 MySQL 服务器逻辑架构图 最上层的服务并不是MySQL所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构&#xff0c;比如连接管理、授权认证、安全等等。 大多数MySQL的核心服务都在第二层&#xff0c;包括查询解析、分析、优化、…

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

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

vscode关于java扩展

包含IDEA同款代码提示&#xff0c;vscode的debug&#xff0c;除了创建类要手动新建java文件以外&#xff0c;其他都还行&#xff0c;满足初学者要求。

Python+Pytest+Allure+Yaml接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人&#xff1a;CesareCheung 更新时间&#xff1a;2024.06.20 一、技术栈 PythonPytestAllureYaml 版本要求&#xff1a;Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 1、安装python3.7&#xff0c;并配置…

C++编程逻辑讲解step by step:根据关键词自动判断文章的类别,去掉无关词后统计文章中每个单词出现的频率。

题目分析 根据关键词自动判断文章的类别。共2篇文章&#xff08;用char s1[]和char s2[]保存&#xff09;&#xff0c;去掉无关词后&#xff08;用char irrelevant[][10]保存&#xff09;&#xff0c;统计文章里面每个单词出现的频率&#xff1a;关键词个数去掉无关词后的文章…

前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序

这一小节&#xff0c;我们说一下前端 js-tool-big-box 这个工具库&#xff0c;添加的数值型数组的正向排序和倒向排序。 以前呢&#xff0c;我们的数组需要排序的时候&#xff0c;都是在项目的utils目录里&#xff0c;写一段公共方法&#xff0c;弄个冒泡排序啦&#xff0c;弄…

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法,亲测有效!!!

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 确定具体异常类型 检查输入参数 验证算法支持性 调整安全策略 确保资源可…

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页 超过指定时间未点击滑动 则继续开始滚动 直接上代码 componentSwiper.vue 需要注意页面切换时清除计时器 <template><view><view class"swiperPanel" touchstart"startMove"…

Verilog刷题笔记48——FSM1型异步复位

题目: 解题&#xff1a; module top_module(input clk,input areset, // Asynchronous reset to state Binput in,output out);// parameter A0, B1; reg state, next_state;always (*) begin // This is a combinational always block// State transition logiccase(…

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台 vSphere 8.0U3 | ESXi 8.0U3 & vCenter Server 8.0U3 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&am…

【yolov8:报错AttributeError: ‘Segment‘ object has no attribute ‘detect‘】

今天在运行yolov8的Segment模式的val模型测验时报错&#xff1a; AttributeError: ‘Segment’ object has no attribute ‘detect’ 原因是yolov8的版本问题&#xff0c;更新至最新版就可以了&#xff1a; 输入ultralytics查看版本 卸载当前的老版本 然后下载最新版本就可以…

【前端】Vue项目和微信小程序生成二维码和条形码

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享Vue项目和微信小程序如何生成二维码和条形码&#xff0c;介绍了JsBarcode、wxbarcode等插件&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01…

为什么要学Java?

想要自己教会自己java&#xff0c;从小白成长到架构师。实现硬实力就业&#xff01; 因为Java是全球排名第一的编程语言&#xff0c;Java工程师也是市场需求最大的软件工程师&#xff0c;选择Java&#xff0c;就是选择了高薪。 为什么Java应用最广泛&#xff1f; 从互联网到…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4141(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、运行效果: 三、软件部分: 1)、SPI读写: 2)、初始化部分: void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks …

SQL连接与筛选:解析left join on和where的区别及典型案例分析

文章目录 前言数据库在运行时的执行顺序一、left join on和where条件的定义和作用left join on条件where条件 二、left join on和where条件的区别原理不同left join原理&#xff1a;where原理&#xff1a; 应用场景不同执行顺序不同&#xff08;作用阶段不同&#xff09;结果集…