二刷代码随想录代码训练营Day 35|01背包问题 二维、01背包问题 一维、力扣416. 分割等和子集

news/2024/9/23 0:59:44/

1.01背包问题 二维

代码随想录

视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构算法_哔哩哔哩_bilibili

代码:

#include <iostream>
#include <vector>
using namespace std;
int main(){int n,bagweight;cin >> n >> bagweight;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];}// dp[i][j] 表示在容量为j的情况下,从【0,i】的物品里任取所能达到的最大价值vector<vector<int>> dp(n,vector<int>(bagweight + 1,0));for(int j = weight[0]; j <= bagweight; j++){dp[0][j] = value[0];}for(int i = 1; i < n; i++){for(int j = 1; j <= bagweight; 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][bagweight] << endl;
}

 note:

dp数组的含义:在容量为j的背包中,装入种类为[0,i]的物品,所能拥有的最大价值为value[i][j]

递推公式:如果容量不够weight[i],dp[i][j] = dp[i - 1][j];如果容量够,dp[i][j] = max(dp[i - 1][j] ,dp[i - 1][j - weight[i] + value[i])

dp数组的初始化:按照定义去进行初始化,因为所有的元素都依赖于上一行的元素,因此,只需要初始化第一行。第一行的元素,物品种类都是0,容量在变化——因此,将容量大于等于第0种物品的元素全部初始化为value[0]

遍历顺序:在二维数组里,先背包还是先物品,都没差。遍历顺序也是,不影响。

2.01背包问题 一维

代码随想录

视频讲解:带你学透01背包问题(滚动数组篇) | 从此对背包问题不再迷茫!_哔哩哔哩_bilibili

代码:

#include <iostream>
#include <vector>
using namespace std;
int main(){int n,bagweight;cin >> n >> bagweight;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];}// dp[i][j] 表示在容量为j的情况下,从【0,i】的物品里任取所能达到的最大价值vector<int> dp(bagweight + 1,0);for(int i = 0; i < n; i++){for(int j = bagweight; j >=weight[i]; j--){ // 确保每个物品只添加一次dp[j] = max(dp[j],dp[j - weight[i]] + value[i]);}}cout << dp[bagweight] << endl;
}

 note:

一维数组是对二维数组的压缩,因为在二维dp数组种,下一行的元素只需要依靠上一行的元素得出。因此,我们可以只用一个一维数组来实现——每次更新的时候,利用目前数组已有的旧数据去推出新数据。

dp数组的含义:容量为j的背包,装种类为[0,i]的物品,所能拥有的最大价值为dp[j]

递推公式:在容量大于等于物品i的种类时,dp[j] = max(dp[j],dp[j - weight[i]] + value[i] )

dp数组的初始化:dp[0] = 0

遍历顺序:由于一维数组其实是二维数组的“行”,因此为了不破坏这种压缩关系,以及这种递推关系——必须先遍历物品再遍历背包容量。

且,01背包不需要去依靠前一个元素去叠加个数,因此在遍历背包容量时要使用倒序遍历,保证每个元素只使用一次。

3.分割等和子集

代码随想录

视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili

代码:

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

 note:

本题相当于问容量为j的背包可否装满 即dp[target ] == target

dp数组的含义:用下标为[0,i]的nums元素来装容量为j的背包所能装的最大价值为dp[j],这里的价值和重量都是nums[i]

递推公式:在容量j大于等于nums[i]的前提下,dp[j] = max(dp[j],dp[j - nums[i]] + nums[i])

dp数组的初始化:dp[0] = 0

遍历顺序:本题使用的是一维01背包问题的模板,因此,要先遍历物品再遍历背包容量,且在遍历背包容量的时候要倒序遍历。


http://www.ppmy.cn/news/1512270.html

相关文章

深入底层:汇编语言调试的艺术与挑战

标题&#xff1a;深入底层&#xff1a;汇编语言调试的艺术与挑战 引言 在软件开发的迷宫中&#xff0c;调试是开发者寻找并解决问题的罗盘。对于汇编语言这一级接近硬件的编程语言&#xff0c;调试不仅是一项技术活&#xff0c;更是一种艺术。本文将探讨汇编语言中调试的概念…

windows C++- Com技术简介(上)

在介绍C和winrt与COM组件技术的关系之前&#xff0c;有必要介绍一下com组件技术&#xff0c;这项技术比较古老&#xff0c;但是它一直作为windows的基石存在。COM 是一类独立于平台且面向对象的分布式系统&#xff0c;用于创建可交互的二进制软件组件。 COM 技术是 Microsoft O…

Compose(10)单元测试

在 Jetpack Compose 中进行单元测试可以帮助确保你的用户界面代码的正确性和稳定性。以下是关于 Compose 单元测试的介绍&#xff1a; 一、添加测试依赖 在项目的 build.gradle 文件中添加测试相关的依赖项&#xff0c;例如&#xff1a; androidTestImplementation androidx…

Veritas NBU8.3.0.2安装Media Server(篇三)

一、环境自检阶段 1、Media角色地址为192.168.189.3&#xff0c;计算机名称为bakmedia&#xff0c;域名为sszz.com 2、防火墙均已关闭 二、hosts解析配置 在安装之前需要在hosts文件中配置解析&#xff0c;master和media都需要配置&#xff1b;后期如果备份客户端也需要为客户…

PX4固定翼控制器详解(四)——TECS高度、速度控制器(续)

回顾复习 上一期关于TECS控制器的讲解&#xff0c;我们得到了基础框架下的TECS控制器如下图所示。 总能量、比能量相关量计算方式如下&#xff1a; { E ˙ V ˙ g γ B ˙ γ − V ˙ g E ˙ e ( V ˙ s p g γ s p ) − ( V ˙ g γ ) B ˙ e ( γ s p − V ˙ s p…

ThinkPHP的SQL注入漏洞学习

目录 漏洞环境 漏洞概要 函数学习 call_user_func函数 mplode函数 漏洞分析 漏洞修复 攻击总结 漏洞环境 漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 漏洞…

docker-harbor 仓库上传下载镜像以及仓库之间的镜像复制

目录 harbor概念 实验架构&#xff1a; 实验操作&#xff1a; 一、部署服务端 客户端和服务端之间上传、下载镜像、权限控制 服务端本机上传镜像 客户端上传和下载镜像 通过角色对权限进行控制 仓库之间的镜像复制 harbor概念 harboy&#xff1a;是开源的企业级的doc…

Nginx负载均衡调度状态

Nginx负载均衡调度状态 一、down状态二、backup状态三、max_fails状态四、fail_timeout状态 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Nginx负载均衡中&#xff0c;合理配置服务器的调度状态对于确保服务的高可用性和稳定性至关重要…