算法训练营第四十二天|动态规划:01背包理论基础 416. 分割等和子集

目录

  • 动态规划:01背包理论基础
  • 416. 分割等和子集

动态规划:01背包理论基础

文章链接:代码随想录
题目链接:卡码网:46. 携带研究材料

01背包问题
二维数组解法:

#include <bits/stdc++.h>
using namespace std;void slove(int M, int N){vector<vector<int>> dp(M, vector<int> (N + 1));vector<int> weight(M), value(M);for (int i = 0; i < M; i++){cin >> weight[i];}for (int i = 0; i < M; i++){cin >> value[i];}for (int j = 0; j <= N; j++){if (j >= weight[0]) dp[0][j] = value[0];}for (int i = 1; i < M; i++){for (int j = 0; j <= N;  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[M - 1][N] << endl;
}int main(){int M, N;cin >> M >> N;slove(M, N);return 0;
}

思路:就是按代码随想录上的那张二维表来看,更新 j 重量下的背包能放0 - i 中多少最大价值的物品;然后一行一行的更新,更新到新物品时,要么就是在 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]);

其中,

dp[i - 1][j]

代表不放入 i 物品

dp[i - 1][j - weight[i]] + value[i]

代表在 j 重量下先空出weight[i]这么大的空间,然后再放如 i 物品,它可能是本来就有这么大空间,也可能是把其它一些物品拿出去后再放入的 i 物品。

一维(滚动数组)数组解法:

#include <bits/stdc++.h>
using namespace std;void slove(int M, int N){vector<int> dp(N + 1, 0);vector<int> weight(M), value(M);for (int i = 0; i < M; i++){cin >> weight[i];}for (int i = 0; i < M; i++){cin >> value[i];}for (int i = 0; i < M; i++){for (int j = N; j >= weight[i]; j--){dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}}cout << dp[N] << endl;
}int main(){int M, N;cin >> M >> N;slove(M, N);return 0;
}

一维数组相比二维数组解法就是将每次更新都放在一行上,而且省去了初始化,所以会节省很多空间,这点在后面 leetcode 上的那题会看到比较。另外要注意在遍历重量时是倒序遍历的:

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

正序遍历会引起重复,而二维数组不会重复是因为每行都用的是上一行的值来更新的。
第一天理解的时候迷迷糊糊,第二天没事时有想了一会突然茅塞顿开了哈哈哈。

416. 分割等和子集

文章链接:代码随想录
题目链接:416. 分割等和子集

思路:01背包应用问题,留足背包的容量,也就是最大总和的一半值加一,如果更新到最后在半值重量的背包中能正好装满,就说明数组可以对半分。
二维数组解法:

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

一维(滚动)数组解法:

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


这里可以看出两种解法的时间空间对比,显然二维解法有着更大的时间和空间复杂度。因此以后的应用问题尽可能一维(滚动)数组解法。

第四十二天补卡,这两天回学校吃组饭,又耽误了两天,后面那顿饭你不行不去吃了;大体知识能串联起来了,今天开始撸项目背八股,哪不会学哪了,单学效率太低了,争取能在春节后找到个实习,加油!!!

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

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

相关文章

jsonvue-mobile 联动方式说明。

目录 jsonvue-mobile的联动类型分为两种 一种是命令式的&#xff1a; 另一种是响应式的&#xff1a; 联动场景 场景一&#xff1a;某一个字段的值变化时&#xff0c;同步修改另一个字段的值 命令式&#xff1a; 响应式&#xff1a; 场景一演示效果GIF 场景二&#xff1…

【模块系列】STM32TCS3472

前言 手上正好有TCS3472模块&#xff0c;也正好想在加深一下自己对I2C协议的理解和应用&#xff0c;所以就写了这个代码库出来。参考的资料主要来源于TCS3472的数据手册&#xff0c;和arduino中MH_TCS3472库的宏定义&#xff0c;和函数名称&#xff0c;我就没有重新命名&#x…

华为数通HCIA题库(750题)

完整题库在这里&#xff1a;华为数通HCIA-RS题库注释版-加水印.pdf资源-CSDN文库 此处只节选几题。 1.网络管理员在网络中捕获到了一个数据帧&#xff0c;其目的MAC地址是01-00-5E-AO-B1-C3。关于该MAC地址的说法正确的是&#xff08; )。 A.它是一个单播MAC地址 B.它是一个广播…

详解ajax、fetch、axios的区别

众所周知它们都用来发送请求&#xff0c;其实它们区别还蛮大的。这也是面试中的高频题&#xff0c;本文将详细进行讲解。 1. ajax 英译过来是Aysnchronous JavaScript And XML&#xff0c;直译是异步JS和XML&#xff08;XML类似HTML&#xff0c;但是设计宗旨就为了传输数据&a…

从JDK源码级别剖析JVM类加载器

欢迎大家关注我的微信公众号&#xff1a; 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。 package com.tuling.jvm;public class Math {public static final int initData 666;public static User u…

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测 目录 多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-HKELM霜冰算法优化混合核极限学…

Git命令(bash)

来由 本地版本控制 集中版本控制 分布版本控制 每个人都有全部代码&#xff0c;安全性有待考究 对比 常用命令 配置 查看配置 (全部) git config -l (系统) git config --system --list (本地&#xff0c;也就是用户自己配置的) git config --global --list 配置自己的na…

使用CLIP和LLM构建多模态RAG系统

在本文中我们将探讨使用开源大型语言多模态模型(Large Language Multi-Modal)构建检索增强生成(RAG)系统。本文的重点是在不依赖LangChain或LLlama index的情况下实现这一目标&#xff0c;这样可以避免更多的框架依赖。 什么是RAG 在人工智能领域&#xff0c;检索增强生成(re…

Provide/Inject 依赖注入(未完待续)

父组件传递给子组件数据&#xff0c;通过props&#xff0c;但是需要逐层传递 provide/Inject 的推出就是为了解决这个问题&#xff0c;它提供了一种组件之间共享此类值的方式,不必通过组件树每层级显示地传递props 目的是为了共享那些被 认为对于一个组件树而言是全局的数据 p…

Ubuntu 22.04.3 LTS arm64 aarch64 ISO jammy-desktop-arm64.iso 下载

Ubuntu 22.04.3 LTS (Jammy Jellyfish) Daily Build 参考 Are there official Ubuntu ARM / aarch64 desktop images? - Ask Ubuntu

浅谈有源滤波装置应用在水处理行业配电系统中

摘要&#xff1a;水处理行业供配电系统涉及曝气风机、提升泵、污泥脱水设备等负载设备&#xff0c;导致异步电机产生更多无功功率和大量谐波&#xff0c;降低系统功率因数&#xff0c;对配电系统和负载造成很大危害。因此&#xff0c;水处理行业需要更加重视电能质量&#xff0…

解码数据:数据可视化的魔力在于快速概括

在信息爆炸的时代&#xff0c;我们每天都面临着海量的数据&#xff0c;无论是个人生活中的各种记录&#xff0c;还是工作中的业务数据&#xff0c;都充斥着我们的日常。如何从这些数据中快速实现归纳总结&#xff0c;理清思路&#xff0c;找出关键信息&#xff1f;数据可视化应…

记录浏览器莫名其妙部分网页无法访问的一个解决办法

问题描述&#xff1a; 不知道什么原因&#xff0c;浏览器无法访问CSDN了&#xff0c;访问其他网站都可以正常加载。 经电脑网络诊断检测&#xff0c;反馈内容大致为&#xff1a; 资源处于联机状态但未对连接尝试做出响应&#xff0c;远程计算机不接受端口443上的连接。 测试…

CNAS中兴新支点——软件测试报告如何编写,出检测报告第三方实验室推荐

进行软件测试工作&#xff0c;编写一份软件测试报告对于测试人员来说必不可少。虽然编写软件测试报告是软件测试人员的工作&#xff0c;但是项目的开发人员比如程序员、软件使用单位对软件测试报告的组成部分有一定的了解也是十分有必要的&#xff0c;软件测试报告比较容易理解…

统计学-R语言-1

文章目录 统计学介绍基本类型数据和变量数据抽样总结 统计学介绍 统计学(statistics)是“数据的科学” 1.是用以收集数据、分析数据和由数据得出结论的一组概念、原则和方法。 2.统计学进行推断的基础是数据(data)。数据不仅仅限于数字&#xff0c;也可能是图表、视频、音频或…

Talk|斯坦福大学史浩辰:学习结构化世界模型用于现实世界中柔性物体的操控

本期为TechBeat人工智能社区第562期线上Talk。 北京时间1月10日(周三)20:00&#xff0c;斯坦福大学博士生—史浩辰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “学习结构化世界模型用于现实世界中柔性物体的操控”&#xff0c;介绍了他的团队在…

03-JVM虚拟机-课堂笔记

3-JVM虚拟机 灵魂三问&#xff1a; JVM是什么&#xff1f; JVM广义上指的是一种规范。狭义上的是JDK中的JVM虚拟机。 为什么要学习JVM&#xff1f; 面试过程中&#xff0c;经常会被问到JVM。 研发过程中&#xff0c;肯定会面临一些重难点问题与JVM有关系。例如&#xff1a…

计算机毕业设计------SSH宿舍管理系统

项目介绍 本项目分为三种角色&#xff1a;系统管理员、楼宇管理员、学生&#xff1b; 系统管理员主要功能如下&#xff1a; 楼宇管理员管理、学生管理、楼宇管理、宿舍管理、学生入住登记、学生寝室调换、学生迁出登记、学生缺勤记录、修改密码、退出登录 楼宇管理员主要功能…

密码学(三)

文章目录 前言一、Software Attestation Overview二、Authenticated Key Agreement三、The Role of Software Measurement 前言 本文来自 Intel SGX Explained 请参考&#xff1a; 密码学&#xff08;一&#xff09; 密码学&#xff08;二&#xff09; 一、Software Attesta…

单片机原理及应用:定时器与计数器中断

时间概念 中断结构 引脚 TCON TMOD IE IP 时间概念 在一般单片机中&#xff0c;有2个16位可编程的硬件计数模块T0和T1&#xff0c;我们称其为计数器或定时器&#xff0c;顾名思义&#xff0c;该模块可以实现定时和计数两种功能&#xff0c;其功能由软件控制和切换。实质…