代码随想录算法训练营第42天 | 01背包理论基础 416.分割等和子集

01背包理论基础

  • 问题定义:有n件物品和一个能装重量为w的背包,第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包获得的总价值最大。
  • dp数组含义:dp[i][j] 表示从下标为 [0,i] 的物品中选,放进容量为j的背包中,能得到的最大价值总和。
  • 确定递推公式:在推导 dp[i][j] 时有两个方面:一是不放物品i,因为不放i物品,所以dp[i][j] = dp[i - 1][j],是只放前 i-1 个物品时的最大值;二是放物品i,dp[i][j] = dp[i - 1][j - weight[i]] + value[i]。当背包容量小于i号物品重量时赋值第一方面的值,否则赋值为两种情况的最大值。
  • 确定初始化:dp[i][0] 由于背包容量为0,根本放不进物品,所以初始化为0。dp[0][j] 只放0号物品,当 j >= weight[0] 时有值value[0],其他情况为0。
  • 遍历顺序:这是重点,要决定当前的状态,必须由其左上角的状态决定。先遍历物品还是先背包容量都是可以的。
#include <bits/stdc++.h>
using namespace std;
int n, bagweight;
void solve() {vector<int> weight(n, 0);vector<int> value(n, 0);for(int i = 0; i < n; i++) {cin >> weight[i];}for(int i = 0; i < n; i++) {cin >> value[i];}vector<vector<int>> dp(n, vector<int>(bagweight + 1, 0));for(int i = weight[0]; i <= bagweight; i++) {  // 初始化dp[0][i] = 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;
}
int main() {while(cin >> n >> bagweight) {solve();}return 0;
}

滚动数组空间优化

我们观察二维数组的递推式,可以发现 dp[i][j] 只与 i - 1 那一层的状态有关。因此可以用一个一维数组来表示状态。

  • dp[j] 表示容量为 j 的背包能获得的最大价值总和。
  • 因为在当前遍历过程中 dp 中存储的就是上一层的状态,因此状态递推式为
    dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
  • 初始化:下标0位置一定初始化为0,其他位置为了递推式中的取最大值服务,也初始化为0即可。
  • 遍历顺序背包容量的遍历需要从大到小,倒序遍历是为了保证物品i只被放入一次。当前遍历中未处理的部分都是i-1那一层的值,因此只有倒序遍历才能保证用到的状态没用过物品i。另一方面,我们更新状态需要知道当前位置左侧的i-1状态 (j-weight[i]),正序遍历就让左侧的状态变成当前层的。
#include <bits/stdc++.h>
using namespace std;
int main() {int n, bagweight;while(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 i = 0; i < n; i++) {cin >> value[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;}return 0;
}

分割等和子集

Alt
其实用回溯可解,但是会超时。因为每一个元素只能用一次,考虑01背包试一下。
背包的大小为 sum / 2,每一个元素看做物品,其重量为元素值,价值也为元素值。问题就转换成在sum / 2的背包中放入元素,让背包尽可能的满,由于重量等于价值,就变成让价值总和尽量大,最终查看最大值是否与sum / 2相等,就能判断能不能分割。

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]);}}return dp[target] == target;}
};

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

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

相关文章

(篇九)MySQL常用内置函数

目录 ⌛数学函数 ⌛字符串函数 ⌛聚合函数 ⌛日期函数 &#x1f4d0;获取当前时间 &#x1f4d0;获取时间的某些内容 &#x1f4d0;​编辑 &#x1f4d0;格式化函数 &#x1f4cf;format类型&#xff1a; ⌛系统信息函数 ⌛类型转换函数 数学函数 字符串函数 聚合函…

3060ti显卡+cuda12.1+win10编译安装生成fastdeploy的c++与python库

在cuda12中,调用官方发布的fastdeploy会出现报错,故此自行编译fastdeploy库。 官网编译教程:https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/gpu.md 可选编译选项 编译选项 无论是在何平台编译,编译时仅根据需求修改如下选项,勿…

【大模型上下文长度扩展】MedGPT:解决遗忘 + 永久记忆 + 无限上下文

MedGPT&#xff1a;解决遗忘 永久记忆 无限上下文 问题&#xff1a;如何提升语言模型在长对话中的记忆和处理能力&#xff1f;子问题1&#xff1a;有限上下文窗口的限制子问题2&#xff1a;复杂文档处理的挑战子问题3&#xff1a;长期记忆的维护子问题4&#xff1a;即时信息检…

cpp11新特性之智能指针(下):深入理解现代cpp中的智能指针shared_ptr、unique_ptr 以及 weak_ptr

目录 写在前面 unique_ptr shared_ptr weak_ptr 智能指针的使用陷阱 致谢 写在前面 上一篇文章同大家深入探讨了auto_ptr。今天给大家带来的是对于 shared_ptr、unique_ptr 以及 weak_ptr 的深入理解&#xff0c;通过测试案例和源码剖析对这三种重要的智能指针的使用方法&…

Docker的镜像和容器的区别

1 Docker镜像 假设Linux内核是第0层&#xff0c;那么无论怎么运行Docker&#xff0c;它都是运行于内核层之上的。这个Docker镜像&#xff0c;是一个只读的镜像&#xff0c;位于第1层&#xff0c;它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…

COMSOL接触(高度非线性)仿真常见报错及解决方法总结

前言 由于COMSOL采用隐式求解器&#xff0c;相较于使用显式求解器的Dyna、Abaqus等软件。要在COMSOL中实现结构接触这一高度非线性问题难度较大&#xff0c;报错时有发生。究其原因&#xff0c;是当物体之间相互接触时&#xff0c;物体受到的应力、运动路径会发生突变&#xff…

Qt Windows和Android使用MuPDF预览PDF文件

文章目录 1. Windows MuPDF编译2. Android MuPDF编译3. 引用 MuPDF 库4. 解析本地PDF文件 1. Windows MuPDF编译 使用如下命令将MuPDF的源码克隆到本地 git clone --recursive git://git.ghostscript.com/mupdf.git直接用VS&#xff0c;打开 mupdf/platform/win32/mupdf.sln …

FPGA_vga显示

一 VGA 1.1 VGA VGA是视频图像阵列&#xff0c;是一种使用模拟信号进行视频传输的标准协议。 1.2 VGA接引脚定义 VGA分公母两种&#xff0c;RGB显示标准。 1.3 VGA显示器 VGA显示器采用图像扫描的方式进行图像显示&#xff0c;将构成图像的像素点&#xff0c;在行同步信号…

如何在 emacs 上开始使用 Tree-Sitter(windows)

文章目录 如何在emacs上开始使用Tree-Sitter&#xff08;windows&#xff09; 如何在emacs上开始使用Tree-Sitter&#xff08;windows&#xff09; 参考&#xff1a;“How to Get Started with Tree-Sitter”。 首先要有一个可运行的emacs&#xff0c;并且它支持Tree-Sitter&…

【C++】中的 inline 用法

1、引入 inline 关键字的原因 在 c/c 中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了 inline 修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程序的局部数据&#xff08;也就是函数内数据&a…

Python环境下基于辛几何模态分解的信号分解方法

基于辛几何的分析方法是一种保护相空间几何结构的新型分析方法&#xff0c;主要用于求解动力学和控制系统中矩阵或Hamilton矩阵的特征值问题&#xff0c;用来解决在动力学和控制系统理论的2n2n矩阵或哈密顿矩阵的特征值问题&#xff0c;已应用到结构损伤信号、奇异微分方程等系…

Visio 2019下载安装教程,保姆级教程,附安装包

前言 Visio是负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂信息、系统和流程进行可视化处理、分析和交流&#xff0c;可以促进对系统和流程的了解&#xff0c;深入了解复杂信息并利用这些知识做出更好的业务决策。帮助您创建具有专业外观的图表&#xff0c…

mac电脑安装cocoapods出错,以及安装最新版本ruby方法

macbook安装cocoapods时碰到一个报错&#xff1a;大概率是ruby的版本太低导致的 sudo gem install cocoapods ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension. ... Could not create Makefile due to some reason, probably lack of neces…

redisson源码解析

由于synchronized跟ReetrantLock是JVM级别的锁&#xff0c;在分布式情况下失效&#xff0c;这时候我们通常会选择redisson基于redis封装好的分布式锁。下面我们一起来分析以下redisson的源码。 使用方式 流程 getLock源码 给命令执行器赋值给看门狗时间赋值&#xff0c;默认30…

年假作业day2

1.打印字母图形 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int i,j; char k; for(i1;i<7;i) { for(j1;j<i;j) { printf("%c",_); } for(j0,…

GetBilibiliVideo:一个下载B站视频的开源神器,让你轻松管理你的二次元世界。

正文&#xff1a; 引言 在广大ACG爱好者和内容创作者之间&#xff0c;哔哩哔哩&#xff08;Bilibili&#xff09;已经成为了不可或缺的视频分享与学习平台。为了满足用户对B站视频离线观看及备份的需求&#xff0c;我精心开发了一个名为 GetBilibiliVideo 的开源工具&#xf…

如何将mongodb+django部署到云服务器上(备份)

在有了一台云服务器之后&#xff0c;我们就可以把写在本机上的程序&#xff0c;搬到服务器上了。采用WinSCP在本机和服务器之间交换文件&#xff1b;FinalShell来操作服务器。 1、mongodb-本机到服务器 主要是三个步骤&#xff1a;dump本地数据库-上传-导入&#xff0c;详情请…

tkinter绘制组件(41)——菜单按钮

tkinter绘制组件&#xff08;41&#xff09;——菜单按钮 引言布局函数结构按钮部分菜单显示完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 TinUI5的新控件&#xff0c;菜单按钮&#xff0c;menubutton。 这是一个与TinUI菜单&#xff08;menubar&#xff0…

ctfshow——命令执行

文章目录 web 29——通配符*绕过web30——调用其他命令执行函数web 31——参数逃逸web 32-web 36——配合文件包含伪协议web 37-web 39——文件包含web 40—— web 29——通配符*绕过 i不区分大小写&#xff0c;直接?csystem(tac fl*.php); web30——调用其他命令执行函数 调用…

网络攻防模拟与城市安全演练 | 图扑数字孪生

在数字化浪潮的推动下&#xff0c;网络攻防模拟和城市安全演练成为维护社会稳定的不可或缺的环节。基于数字孪生技术我们能够在虚拟环境中进行高度真实的网络攻防模拟&#xff0c;为安全专业人员提供实战经验&#xff0c;从而提升应对网络威胁的能力。同时&#xff0c;在城市安…