动态规划母题:01背包问题

news2025/2/24 6:46:18

1. 前置知识

动态规划与图论,前缀和与差分等有模板的算法不同,动态规划更考察思维能力,而不是运用模板的能力。

个人认为 Acwing 关于动态规划的讲解比较容易理解。我会根据 Acwing 的动态规划解题思路来讲解题目。

虽说动态规划没有固定的模板,但是还是有相对固定的套路。但是思维能力以及经验积累在解决动态规划的题目中十分重要。

集合:表示状态中每一个下标位置可能的选择。

属性:表示状态中每一个下标位置可能的选择的属性。(一般是最大值或者最小值,将选择附加上属性,就会得到每一个下标位置的最终结果)。

状态计算:将每一个状态中的集合进行划分,根据集合的划分推出状态转移方程。

集合划分的依据:划分出来的所有集合的并集不得遗漏一个状态中的任何选择。但是可以重复。

这些东东可能会很抽象,后面的例题会帮助大家理解这写东东。

2. 01背包问题 (来源:Acwing)

原题链接:2. 01背包问题 - AcWing题库

题目描述:

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式:

第一行两个整数,N,V,,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi, wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式:

输出一个整数,表示最大价值。

数据范围:

0 < N, V ≤1000
0< vi, wi ≤1000

输入样例:

4 5
1 2
2 4
3 4
4 5

输出样例:

8

我们直接按照上面给出的套路来:

状态表示:f [i, j] (代表状态是一个二维的,这里就不写成二维数组的形式了,比较麻烦。) 

二维数组中每一个下标代表的集合:从 1 - i 个物品中选,并且总体积不超过 j 的选法的集合。

属性:集合中选法的最大价值。(将属性附加到集合得到的结果就是二维数组中每个下标的结果)

状态计算:

集合划分:将状态划分成两个集合:1:从1 - i 个物品中选,选择 i ,且价值不超过 j 的所有选法;2:从 1 - (i - 1) 个物品选,不选择 i ,且价值不超过 j 的所有选法。

划分依据的验证:二维数组每一个下标的最终值就是,代表从 1 - i 个物品中选,且总体积不超过 j 的选法的价值最大值。显然这个集合划分没有漏掉该下标位置对应的所有选法。

状态转移方程:根据集合划分,我们只要求出划分出的两个集合中所有选法价值的最大值即可。

注意:j - v[i] 必须保证 j >= v[i] 哦!最终的答案就是 f[N][V] 。

#include<iostream>
using namespace std;

const int N = 1010;
int v[N], w[N];
int f[N][N];
int m, n;

int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m; i++)
        cin >> v[i] >> w[i];
        
    f[0][0] = 0; // 全局变量默认初始化为0,可以不写
    for(int i = 1; i <= m; i++)
    {
        for(int j = 0; j <= n; j++)
        {
            f[i][j] = f[i - 1][j];
            if(j >= v[i])
                f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
        }
    }
    cout << f[m][n] << endl;
        
    return 0;
}

 3. 空间优化

直接将状态从二维压缩到一维,观察结果会不会出错:

f[ i ][ j ] = f[ i - 1][ j ],用到的是上一层即 i - 1 层的状态,若遍历体积大小( j )是从小到大遍历,那么状态压缩之后的计算结果就是用第 i 层的状态来算的,不正确,因此我们需要改变遍历的顺序,从大到小遍历。

f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]),用到的同样是上一层的状态,因此同样不能从小到达遍历体积,必须从大到小遍历体积才能保证状态的转移是从上一层来的。

综上所述,只需要改变体积的遍历顺序就可以将二维的状态压缩到一维。

#include<iostream>
using namespace std;

const int N = 1010;
int v[N], w[N];
int f[N];
int m, n;

int main()
{
    cin >> m >> n;
    for(int i = 1; i <= m; i++)
        cin >> v[i] >> w[i];
        
    f[0] = 0; // 全局变量默认初始化为0,可以不写
    for(int i = 1; i <= m; i++)
        for(int j = n; j - v[i] >= 0; j--)
            f[j] = max(f[j], f[j - v[i]] + w[i]);
            
    cout << f[n] << endl;
        
    return 0;
}

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

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

相关文章

基于Locust实现MQTT协议服务的压测脚本

一、背景简介 业务背景大概介绍一下&#xff0c;就是按照国标规定&#xff0c;车辆需要上传一些指定的数据到ZF的指定平台&#xff0c;同时车辆也会把数据传到企业云端服务上&#xff0c;于是乎就产生了一些性能需求。 目前我们只是先简单的进行了一个性能场景的测试&#xf…

PMP考试到底难在哪里?

那么&#xff0c;PMP考试到底难在哪&#xff1f; 01涉及面广 目前PMP考试内容大部分来源于教材《PMBOK指南》和《敏捷实践指南》。 作为考试出题的知识基础《PMBOK指南》&#xff0c;总共有700多页&#xff0c;所覆盖的知识面很广。 另一方面&#xff0c;根据最新版考纲&am…

使用大型语言模(LLM)构建系统(二):内容审核、预防Prompt注入

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码&#xff1a; import openai#您的openai的api key openai.api_key YOUR-OPENAI-API-KEY def get_…

媒体邀约分步详解

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网 胡老师。 邀请媒体参加活动的有哪些步骤&#xff1a; 活动落地执行&#xff1a;在整个活动方案中&#xff0c;邀请媒体来报道活动&#xff0c;往往会安排在整个活动的中期去做&#xff0c;因此在…

spring-boot集成spring-brick实现动态插件

spring-boot集成spring-brick实现动态插件 spring-boot集成spring-brick实现动态插件 项目结构 & 需求实现spring-boot集成spring-brick 环境说明1. 主程序集成spring-brick 第一步&#xff1a;引入相关依赖第二步&#xff1a;修改程序入口方法第三步&#xff1a;编写配置…

软件测试太卷了,我实在是做不到啊~

前言 本科计算机专业&#xff0c;做了四年软件测试工作&#xff0c;从一开始一脸懵的点点点&#xff0c;到现在会自动化测试了&#xff0c;浅谈一下计算机专业人员从事软件测试的一点点心得体会&#xff0c;仅供参考交流。 如果你本科学的是计算机专业&#xff0c;觉得开发那…

1092 To Buy or Not to Buy (PAT甲级)

1092. To Buy or Not to Buy (20)-PAT甲级真题_柳婼的博客-CSDN博客 柳婼的解法要更清晰一些。 下面是我的解法…… #include <iostream> #include <string>int main(){std::string a, b;bool flag true;int extra, missing;int cntA[62] {0};int cntB[62] {…

银行项目:如何大规模、高效率的做自动化测试

背景 近几年&#xff0c;各家商业银行均在大力发展自动化测试。在这一进程中&#xff0c;自动化测试的设计理念不断完善&#xff0c;新的技术不断应用&#xff0c;使得自动化测试资产的积累代价和维护代价不断降低&#xff0c;自动化测试资产的数量不断增长。 在短短几年间&…

【STM32CubeMX项目】DHT11模块

前言 在我的另一篇里文章里已经介绍过DHT11的时序理论了&#xff0c;这里介绍下&#xff0c;我写DHT11的数据获取的思路和调用。程序验证后&#xff0c;发现下述问题&#xff0c;暂时解决不了&#xff0c;但是还是会把个人的代码流程&#xff0c;函数的编写思路和工程写下&…

通过Python封装接口商品ID获取京东商品历史价格数据,京东历史价格数据,京东API接口

京东商品历史价格数据展示了该商品在一段时间内的价格变化情况&#xff0c;可作为购物决策的重要参考因素。用户可以根据历史价格数据来判断当前商品的价格是否处于一个合理水平&#xff0c;并对接下来的价格趋势进行预测。 京东商品历史价格数据可以在商品详情页面中查看&…

【华为自研】| 国产数据库 GaussDB崛起

目录 GaussDBGaussDB 简介产品优势GaussDB(for openGauss)GaussDB(for MySQL)GaussDB(for Cassandra)GaussDB(for Mongo)GaussDB(for Redis)GaussDB(for Influx) GaussDB GaussDB采用一体化架构&#xff0c;同时支持关系型和非关系型数据库引擎&#xff0c;能够满足政企全方位…

2023面试题合集(建议收藏)

写在前面 个人强烈感觉面试因人而异&#xff0c;对于简历上有具体项目经历的同学&#xff0c;个人感觉面试官会着重让你介绍自己的项目&#xff0c;包括但不限于介绍一次真实攻防/渗透/挖洞/CTF/代码审计的经历 > 因此对于自己的项目&#xff0c;面试前建议做一次复盘&…

125760-30-7,Fmoc-Ser(Ac4Galβ1-3Ac2GalNAcα)-OH,由不同糖的混合物组成,包括单糖和双糖

●常用名&#xff1a;O-[4,6-二-O-乙酰基-2-(乙酰氨基)-2-脱氧-3-O-(2,3,4,6-四-O-乙酰基-BETA-D-吡喃半乳糖基)-ALPHA-D-吡喃半乳糖基]-N-[芴甲氧羰基]-L-丝氨酸 ●英文名&#xff1a;Fmoc-Ser(Ac4Galβ1-3Ac2GalNAcα)-OH●外观以及性质&#xff1a; 陕西新研博美生物科技有限…

基于simulink仿真机械手将负载从一个灰色圆柱形平台移动到另一个平台

一、前言 此示例说明了在 Simulink 3D 动画™模型中使用全局坐标。全局坐标可以在模型中以多种方式用于对象跟踪和操作、简单的碰撞检测、触觉效果模拟等。 二、示例 虚拟世界中对象的全局坐标可通过VR源块获得。对于场景中的每个变换&#xff0c;VR 源块的“参数”对话框中的树…

第一次做SDK测试,做个笔记

一、认识SDK 1、含义 SDK是为客户端提供的特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。如拨打电话&#xff0c;摄像机&#xff0c;视频播放/录制&#xff0c;图片保存&#xff0c;预览图片&#xff0c;刷新窗口&#xff0c;显示成功状态页面…

CnOpenData短视频播主排名数据

一、数据简介 短视频即短片视频&#xff0c;是一种互联网内容传播方式&#xff0c;一般是指在互联网新媒体上传播的时长在5分钟以内的视频。随着网红经济的出现&#xff0c;视频行业逐渐崛起一批优质UGC内容制作者&#xff0c;微博、秒拍、快手、今日头条纷纷入局短视频行业&am…

DevOps实践:持续交付和自动化部署的最佳实践

引言 今天给大家分享一篇有关DevOps实践的文章。 在当今快节奏的软件开发环境中&#xff0c;为了保持竞争力&#xff0c;加速交付和提高质量已经成为必须要做到的事情。而DevOps方法论则是解决这些问题的一种综合性方案。 本文将为您介绍DevOps的最佳实践&#xff0c;包括持…

项目管理过程中常见的错误,您都知道吗?

在项目管理过程中&#xff0c;出现错误是很常见的。这些错误可能会导致项目延误、超支、质量下降&#xff0c;甚至会让整个项目失败。因此&#xff0c;了解这些错误&#xff0c;及时采取措施避免和纠正&#xff0c;是每个项目经理必须掌握的技能。 以下是一些常见的项目管理错…

Java001——认识dos和使用基本的dos命令

围绕以下4点来学习&#xff1a; 1、什么是dos? 2、dos的作用? 3、电脑中怎么操作dos? 4、操作dos有哪些基本的dos命令? 一、什么是dos&#xff1f; DOS是磁盘操作系统Disk Operating System&#xff09;的简称。 二、dos的主要作用&#xff1f; DOS 操作系统的主要功能…

Linux tomcat 8 配置访问本地文件,并且配置https

一 、Linux Tomcat 配置访问本地文件 1. 将需要被访问的文件上传至 /opt/datafile 目录下 2. 修改tomcat server.xml文件&#xff0c;增加配置 docBase:文件所在目录 path: 代理访问路劲<Context docBase"/opt/datafile/" path"files" debug"0&q…