算法整理——【动态规划练习(2)01背包】

一、背包问题简述以及01背包解题思路

背包问题包括01背包、完全背包、多重背包等。其中基础和重点就是01背包和完全背包,所以我们现在就背包问题中的01背包和完全背包问题进行学习,使用动态规划解决背包问题。

01背包是其他背包的基础,我们首先对01背包进行学习。纯粹的01背包问题一般描述如下:有n种物品,每种物品只有一个,每个物品有自己的重量和价值,有一个最多只能放重量为m的背包,求这个背包最多能装价值为多少的物品。

我们选择二维dp数组实现。首先我们需要知道动态规划数组的含义。dp[i][j]表示[0,i]物品放入容量为j的背包中的最大价值。dp[i][j]的值的推导我们可以讨论放不放物品i,如果不放物品i则值为dp[i-1][j];如果放,则为dp[i-1][j-weight[i]]+value[i]。所以递推公式为dp[i][j] = max(dp[i-1][j-weight[i]]+value[i], dp[i-1][j])。

然后找初始化什么。我们由递推公式可以知道,dp[i][j]是由dp数组左上角的值得到的,所以我们可以对第一行和第一列进行初始化为应有的值。

接着确定遍历顺序。根据推导,我们从左到右从上到下遍历即可,无论是for循环先遍历背包还是先遍历物品,都可以。

二、代码练习:携带研究材料

选取了卡码网的一道题46. 携带研究材料(第六期模拟笔试) (kamacoder.com),非常标准的经典的01背包问题。采取上面讲述的思路编写代码,即可得到如下完整代码:

#include <bits/stdc++.h>
using namespace std;

int n, bag;
void solve() 
{
    vector<int> weight(n, 0);
    vector<int> value(n, 0);
    for(int i = 0; i < n; ++i) 
    {
        cin >> weight[i];
    }
    for(int j = 0; j < n; ++j) 
    {
        cin >> value[j];
    }
    vector<vector<int>> dp(weight.size(), vector<int>(bag + 1, 0));


    for (int j = weight[0]; j <= bag; j++) 
    {
        dp[0][j] = value[0];
    }

    for(int i = 1; i < n; i++) 
    {
        for(int j = 0; j <= bag; j++) 
        { 
            if (j < weight[i]) dp[i][j] = dp[i - 1][j];
            else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
        }
    }
    cout << dp[n - 1][bag] << endl;
}

int main() {
    while(cin >> n >> bag) {
        solve();
    }
    return 0;
}

三、代码练习:分割等和子集

题目为416. 分割等和子集 - 力扣(LeetCode),给你一个只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

要注意题目描述中商品是不是可以重复放入。商品如果可以重复多次放入是完全背包,而只能放入一次是01背包,本题为01背包。

本题如何视作01背包呢,我们把sum/2视为背包体积,商品重量和价值均为元素数值。如果背包能正好装满,则为可分割等和子集。

然后我们使用动规五部曲:

①确定dp数组含义。本题我们尝试使用一维dp数组。dp[j]含义为背包容量为j时,放进物品的最大重量。如果dp[j]==j则说明装满了。

②递推公式。dp[j] = max(dp[j],dp[j-nums[i]]+nums[i]);

③初始化。dp[0]初始化为0。

④遍历顺序。因为本题使用的为一维dp数组,所以需要物品循环的for放在外层,遍历背包的for放在内层且内层循环倒序遍历。倒序遍历才能保证每个物品只添加一次(这里比较绕,可以举例子思考一下,我的理解为:因为外面循环是遍历物品,里面是遍历容量,也就是说对于不同容量是否加入这个物品观察结果,然后因为递推公式需要用到前面的结果,如果从前往后遍历则前面已经考虑过是否放改物品了后面还要放,则会导致多次放,如果从后往前,此时前面还未考虑过是否放该物品,所以不影响)。

⑤推导/打印dp数组进行观察和检查。

完整代码如下:

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) 
        {
            sum += nums[i];
        }
        vector<int> dp(sum/2+1,0);
        if(sum%2 == 1) return 0;
        for(int i = 0; i<nums.size(); i++)
        {
            for(int j = sum/2; j>=nums[i]; j--)
            {
                dp[j] = max(dp[j],dp[j-nums[i]]+nums[i]);
            }
        }
        return dp[sum/2]==sum/2;
    }
};

说明:本文为作者整理知识点用于复习巩固,参考了代码随想录的讲解,有问题可以联系作者欢迎讨论~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO-World实时开集检测论文阅读

论文&#xff1a;《YOLO-World: Real-Time Open-Vocabulary Object Detection》 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 1.Abstract 我们介绍了YOLO World&#xff0c;这是一种创新的方法&#xff0c;通过在大规模数据集上进行视觉语言建模和预训练&#…

hello, I am a robot.

hello, I am a robot. 嗨&#xff0c;我是个机器人 凌晨了&#xff0c;真是糟糕的一天&#xff0c;超时半小时&#xff0c;我们的计划有点问题&#xff0c;应该做出改进。 加班这种事情说明项目本身就存在问题&#xff0c;我们应该对此做出分析&#xff0c;而不是宣传吃苦耐劳的…

12.x86游戏实战-汇编指令and or not

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;11.x86游戏实战-汇编指令add sub inc dec and指令是与的意思 or指令是或的意思 …

C++学习/复习21--多态定义/虚函数与重写/虚函数表/单继承多继承的多态/抽象类/面试题

一、多态的定义及条件 二、虚函数与重写 2.1virtual 注意事项&#xff1a;只有成员函数可以是虚函数 2.2三同与重写 2.3用基类的指针或引用 注意事项&#xff1a;指针指向什么对象就调用其相应的函数 2.4重写条件的例外 协变与重写 析构函数的重写 为什么析构函数需重写 2.5o…

Hive 高可用分布式部署详细步骤

目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中&#xff0c;将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…

加密与安全_常见的分组密码 ECB、CBC、CFB、OFB模式介绍

文章目录 Pre概述why分组密码和流密码的基本概念什么是模式分组密码的常见模式1. ECB 模式&#xff08;电子密码本模式&#xff09;2. CBC 模式&#xff08;密文分组链接模式&#xff09;3. CFB 模式&#xff08;密文反馈模式&#xff09;4. OFB 模式&#xff08;输出反馈模式&…

论文略读:Can Long-Context Language Models Subsume Retrieval, RAG, SQL, and More?

202406 arxiv 1 intro 传统上&#xff0c;复杂的AI任务需要多个专门系统协作完成。 这类系统通常需要独立的模块来进行信息检索、问答和数据库查询等任务大模型时代&#xff0c;尤其是上下文语言模型&#xff08;LCLM&#xff09;时代&#xff0c;上述问题可以“一体化”完成…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

Python 全栈系列258 线程并发与协程并发

说明 最近在大模型调用上&#xff0c;为了尽快的进行大量的数据处理&#xff0c;需要采用并发进行处理。 Before: 以前主要是自己利用CPU和GPU来搭建数据处理程序或者服务&#xff0c;资源受限于所用的硬件&#xff0c;并不那么考虑并发问题。在处理程序中&#xff0c;并发主要…

互联网十万个为什么之什么是数据备份?

数据备份是按照一定的备份频率创建数据副本的过程&#xff0c;将重要的数据复制到其它位置或者存储介质&#xff0c;并对生成的副本保留一定的时长。备份通常储存在不同的物理介质或云端&#xff0c;以确保数据的连续性和完整性。有效的备份策略至关重要&#xff0c;以防止数据…

ESP32-C3-Arduino-uart

引脚图 2实现串口发送接收 1默认值初始化串口&#xff08;默认是uart0&#xff09; Serial.begin(UART_BAUD); 参数是波特率 2自定义其他串口 2-1创建实例 HardwareSerial SerialUART(0); //数值指的是uart0 1为uart1.。。。。 2-2初始化 SerialUART.begin(UART_BAU…

LabVIEW的Actor Framework (AF) 结构介绍

LabVIEW的Actor Framework (AF) 是一种高级架构&#xff0c;用于开发并发、可扩展和模块化的应用程序。通过面向对象编程&#xff08;OOP&#xff09;和消息传递机制&#xff0c;AF结构实现了高效的任务管理和数据处理。其主要特点包括并发执行、动态可扩展性和强大的错误处理能…

不是哥们?你怎么抖成这样了?求你进来学学防抖吧!全方位深入剖析防抖的奥秘

前言 古有猴哥三打白骨精&#xff0c;白骨精 > 噶 今有用户疯狂点请求&#xff0c;服务器 > 噶 所以这防抖咱必须得学会&#xff01;&#xff01;&#xff01; 本文就来讲解一下Web前端中防抖的奥秘吧&#xff01;&#xff01;&#xff01;&#xff01; 为什么要做防…

适用于 Windows 11/10/8/7/Vista/XP 的最佳免费分区软件

无论您使用的是 SSD、机械磁盘还是任何类型的 RAID 阵列&#xff0c;硬盘驱动器都是 Windows 计算机中不可或缺的组件。在将文件保存到全新磁盘之前&#xff0c;您应该初始化它&#xff0c;创建分区并使用文件系统格式化。在运行计算机一段时间后&#xff0c;您需要收缩、扩展、…

14-25 剑和侠客 – 预训练模型三部曲2 – 视觉

概述 在第 1 部分中&#xff0c;我们讨论了适用于文本的预训练模型的重要性及其在当今世界的相关性。大型语言模型 (LLM)&#xff0c;尤其是 GPT-3 和随后的 GPT-3.5&#xff0c;已经获得了极大的欢迎&#xff0c;从而在 AI 讨论中引起了越来越多的关注。我们已经看到了用于构…

everything高级搜索-cnblog

everything高级搜索用法 基础4选项验证 总结搜索方式 高级搜索搜指定路径文件名: 文件名 路径不含文件名: &#xff01;文件名包含单词 路径包含指定内容: 路径 content:内容 大小写 区分大小写搜索搜指定路径文件名: case:文件名 路径全字匹配 全字搜指定路径文件名: wholewo…

网络安全基础-2

知识点 1.网站搭建前置知识 域名&#xff0c;子域名&#xff0c;DNS&#xff0c;HTTP/HTTPS&#xff0c;证书等 注册购买域名&#xff1a;阿里云企航_万网域名_商标注册_资质备案_软件著作权_网站建设-阿里云 2.web应用环境架构类 理解不同WEB应用组成角色功能架构: 开发语…

四、(1)网络爬虫入门及准备工作(爬虫及数据可视化)

四、&#xff08;1&#xff09;网络爬虫入门及准备工作&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;网络爬虫入门1.1 百度指数1.2 天眼查1.3 爬虫原理1.4 搜索引擎原理 2&#xff0c;准备工作2.1 分析爬取页面2.2 爬虫拿到的不仅是网页还是网页的源代码2.3 爬虫就是…

Golang | Leetcode Golang题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; func _rob(nums []int) int {first, second : nums[0], max(nums[0], nums[1])for _, v : range nums[2:] {first, second second, max(firstv, second)}return second }func rob(nums []int) int {n : len(nums)if n 1 {return nums[0]}…

7.pwn 工具安装和使用

关闭保护的方法 pie: -no-pie Canary:-fno-stack-protector aslr:查看:cat /proc/sys/kernel/randomize_va_space 2表示打开 关闭:echo 0>/proc/sys/kernel/randomize_va_space NX:-z execstack gdb使用以及插件安装 是GNU软件系统中的标准调试工具&#xff0c;此外GD…