算法整理——【动态规划练习(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.mzph.cn/bicheng/42651.shtml

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

相关文章

【TB作品】51单片机 Proteus仿真 超声波LCD1602ADC0832 身高体重测量仪

00024 超声波LCD1602ADC0832 实验报告&#xff1a;基于51单片机的身高体重测量仪设计 背景介绍 本实验设计并实现了一个基于51单片机的身高体重测量仪。该系统利用超声波传感器测量高度&#xff0c;通过ADC0832模数转换芯片获取重量数据&#xff0c;并使用LCD1602显示屏显示…

Alt与Tab切换窗口时将Edge多个标签页作为一个整体参与切换的方法

本文介绍在Windows电脑中&#xff0c;使用Alt与Tab切换窗口时&#xff0c;将Edge浏览器作为一个整体参与切换&#xff0c;而不是其中若干个页面参与切换的方法。 最近&#xff0c;需要将主要使用的浏览器由原本的Chrome换为Edge&#xff1b;但是&#xff0c;在更换后发现&#…

桌面快充插线板+伸缩数据线,轻松实现1+1>2

手机、平板、笔记本等电子设备已成为我们日常工作和学习的必备工具。然而,随着设备数量的增加,充电问题也日益凸显。桌面空间有限,多个快充头不仅显得杂乱无章,而且效率低下,无法满足我们高效办公的需求。 在这样的背景下,倍思Nomos氮化镓100W桌面充电站凭借其创新的设计和强大…

SpringBoot新手快速入门系列教程七:基于一个低配centoos服务器,如何通过宝塔面板部署一个SpringBoot项目

1&#xff0c;如何打包一个项目 通过IDEA自带的命令行&#xff0c;执行 ./gradlew clean build 2&#xff0c;检查生成的JAR文件 进入 build/libs 目录&#xff0c;你应该会看到一个类似 helloredis-0.0.1-SNAPSHOT.jar 的文件。 3&#xff1a;运行生成的JAR文件 你可以在…

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…

Python面试题:如何在 Python 中读取和写入 JSON 文件?

在 Python 中读取和写入 JSON 文件可以使用 json 模块。以下是具体的示例&#xff0c;展示了如何读取和写入 JSON 文件。 读取 JSON 文件 要读取 JSON 文件&#xff0c;可以使用 json.load() 方法。下面是一个示例代码&#xff1a; import json# 假设有一个名为 data.json 的…

Docker运行MSSQL2022

安装地址: https://hub.docker.com/r/microsoft/mssql-server 拉取mssql容器镜像 docker pull mcr.microsoft.com/mssql/server 拉取成功 运行mssql镜像 docker run -e "ACCEPT_EULAY" -e "MSSQL_SA_PASSWORDAa123456" -p 1433:1433 -d mcr.microsof…

人工智能系列-Python面向对象编程

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 面向对象编程和面向过程编程 在使用计算机语言进行代码编写时&#xff0c;常见的两种思路是面向对象编程和面向过程编程。 面向过程&#xff1a;根据业务逻辑从上到下写代码。…

归一化过程中由于精度问题导致除法后得到0

import numpy as np n3 datanp.array([[100,2000,3],[400,5000,6],[700,8000,9]]) for j in range(n):data_sumdata[:,j].sum()for i in range(n):data[i][j]data[i][j]/data_sum print(data) 得到结果如下&#xff1a; [[0 0 0] [0 0 0] [0 0 0]] 解决方式&#xff1a; …

异常组成、作用、处理方式(3种)、异常方法、自定义异常

目录 异常的组成&#xff1a;运行异常与编译异常 两者区别&#xff1a;编译异常用来提醒程序员&#xff0c;运行异常大部分是由于参数传递错误导致 异常作用&#xff1a; 作用1&#xff1a;就是平时的报错&#xff0c;方便我们找到报错的来源 作用2&#xff1a;在方法内部…

爬虫爬数据犯法吗

爬虫抓取数据是否违法不能一概而论&#xff0c;这取决于多个因素。 在大多数情况下&#xff0c;如果爬虫在未经网站所有者明确许可的情况下&#xff0c;大量抓取有版权保护、涉及个人隐私或违反网站使用条款的数据&#xff0c;就可能构成违法。 例如&#xff0c;抓取受版权保…

一.2.(2)基本共射放大电路组成、工作原理;

1.基本共射放大电路组成 共什么取决于输入输出&#xff0c;共剩下的那一极 2.工作原理 输入信号ui通过电容C1加到三极管的基 极&#xff0c;引起基极电流iB的变化&#xff0c;iB的变化又使集电极电流ic发生变 化&#xff0c;且ic的变化量是iB变化量的β倍。由于有集电极电压&…

ffmpeg 安装 h264(x264)encoder

#下载并安装x264 # 切换root用户 sudo -i # 输入密码cd ~ mkdir FFmpeg7#下载并安装x264 git clone https://code.videolan.org/videolan/x264.git cd x264 mkdir build./configure --help # 报缺少asm 时 可加入--disable-asm # --prefix/home/llh/ffmpeg/build/ 指定安装目录…

linux-虚拟内存-虚拟cpu

1、进程&#xff1a; 计算机中的程序关于某数据集合上的一次运行活动。 狭义定义&#xff1a;进程是正在运行的程序的实例&#xff08;an instance of a computer program that is being executed&#xff09;。广义定义&#xff1a;进程是一个具有一定独立功能的程序关于某个…

Let‘s Encrypt 申请免费 SSL 证书(每隔60天自动更新证书)

文章目录 官网文档简介安装 Nginxacme.sh生成证书智能化生成证书 安装证书查看已安装证书更新证书 官网 https://letsencrypt.org/zh-cn/ 文档 https://letsencrypt.org/zh-cn/docs/ 简介 Let’s Encrypt 是一个非营利组织提供的免费SSL/TLS证书颁发机构&#xff0c;旨在促…

iOS开发-Xcode

iOS开发主要使用两种编程语言&#xff1a;Objective-C 和 Swift。下面分别介绍这两种语言的基础&#xff1a; Objective-C Objective-C 是一种面向对象的编程语言&#xff0c;它是C语言的超集&#xff0c;意味着你可以直接在Objective-C代码中使用C语言的语句。Objective-C在…

2024世界人工智能大会,神仙打架

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈最近又发生了啥新鲜事&#xff1f; 该栏目以周更频率总结国内外前沿AI动态&#xff0c;感兴趣的可以点击订阅合集以及时收到最新推送 B站首秀世界人工智能大会&#xff0c;展示自研AI技术与AIGC…

人工智能在病理切片虚拟染色及染色标准化领域的系统进展分析|文献速递·24-07-07

小罗碎碎念 本期文献主题&#xff1a;人工智能在病理切片虚拟染色及染色标准化领域的系统进展分析 这一期文献的速递&#xff0c;是有史以来数量最大的一次&#xff0c;足足有十一篇&#xff0c;本来打算分两期写&#xff0c;但是为了知识的系统性&#xff0c;我决定咬咬牙&…

Partisia Blockchain 现已完成第一阶段空投,即将在DeFi领域发力

Partisia Blockchain 是以 MPC 方案为基础的 Layer1 生态&#xff0c;其具备可审计的隐私特性&#xff0c;同时还能保持链的可拓展、高迸发、可互操作以及安全等系列特性&#xff0c;Partisia Blockchain 被认为是目前最具潜力的企业级公链&#xff0c;并且估值高达 16 亿美元。…

远心镜头简介

一、远心镜头 大家都有这种印象&#xff0c;一个物体在人眼看来&#xff0c;会有近大远小的现象。这是因为物体近的时候&#xff0c;在视网膜上投影大&#xff0c;小的时候&#xff0c;投影小。镜头也是一样&#xff0c;因为近大远小的原因&#xff0c;会产生误差。特别是在做尺…