代码随想录第37天|动态规划

01背包理论基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考
请添加图片描述

01背包: 每个物品只有一个, 只要选或不选两个选项

暴力解法: 回溯法枚举

  1. dp[i][j]: i 表示 0 ~ i 的物品, j 表示容量, 数值表示当前的最大价值
  2. 递推公式: max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])
  3. 初始化: j = 0 时, 无法放任何有价值的物品, dp[i][0] = 0. i = 0时, 当空间 j 大于 物体0的价值时, 才能放该物品
  4. 遍历顺序: 由于是从左上和正上方推导, 所以先遍历背包或遍历物品都可

当 i 放进去时,物品集就被分成两部分 1~i-1 和 i
若将 i 放进去,那么就把 j 空间中的 w[i] 占据, 剩下 j-w[i] 的空间给前面 i-1 ,
那么只要这时候前面 i-1 在 j-w[i] 空间里构造出最大价值, dp[i-1][j-w[i]],再加上此时放入的i的价值v[i],就是dp[i][j]
请添加图片描述

#include<bits/stdc++.h>
using namespace std;
int main() {int M, N;cin >> M;cin >> N;vector<int> weight;vector<int> value;for (int i = 0; i < M; i++) {int tem;cin >> tem;weight.push_back(tem);}for (int i = 0; i < M; i++) {int tem;cin >> tem;value.push_back(tem);}//dp[i][j] 物品为i, j为重量 
//i索引范围[0 ~ M-1], 大小为 M
//j索引范围[0 ~ N]], 大小为 N + 1vector<vector<int>> dp(M, vector<int>(N + 1, 0));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 = 1; j <= N; j++) { //注意取 =if (j - weight[i] >= 0) {dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}else {dp[i][j] = dp[i - 1][j];}}}cout << dp[M - 1][N] << endl;
}

01背包理论基础(滚动数组)

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

二维数组的递推公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
二维压缩成一维的递推公式: dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);//其中j是表背包容量

二维改为一维的方法:
请添加图片描述
请添加图片描述

正序遍历背包容量时, 会出现重复相加的情况, 图中为物品0不断的被累加
请添加图片描述
倒序遍历背包容量时, 由于会把本次物品的价值先加上, 价值一定比为加之前的大(dp[0~3]一定比dp[4]小), 所以不会出现重复累计的情况
请添加图片描述

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

416. 分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
在这里插入图片描述
参考

思路: 回溯法 (超时)

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

思路: 01背包问题 - 每个元素只能放入一次

  1. dp[j] : 容量为j, 最大价值为dp[j], 在本题中容量和价值相同
  2. 递推公式:
  3. dp数组如何初始化
  4. 遍历顺序

能抽象成01背包最大值的原因:
5. 物品的重量和价值是相同的, dp[sum/2] 的最大值 value <= (sum/2)
6. 所以当 sum == value 时, 代表找到了一个元素

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

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

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

相关文章

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式&#xff0c;用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性&#xff0c;可以处理各种HTTP请求&#xff0c;并支持各种数据格式&#xff0c;如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.根据各网络所指定的地址块完成以下工作&#…

携手亚马逊云科技,维塑科技推出运动健康领域首个AI大模型

导读&#xff1a;生成式AI运动健康&#xff0c;将如何改变我们的生活&#xff1f; 人工智能技术正不断重塑着我们的工作、生活方式。那么&#xff0c;AI能否改善我们的健康状况呢&#xff1f;AI大模型在运动健康领域的探索为我们带来新的想象。 2023年&#xff0c;全球领先的AI…

java之命令执行审计思路

1 漏洞原理 因用户输入未过滤或净化不完全&#xff0c;导致Web应用程序接收用户输入&#xff0c;拼接到要执行的系统命令中执行。一旦攻击者可以在目标服务器中执行任意系统命令&#xff0c;就意味着服务器已被非法控制。 2 审计中常用函数 一旦攻击者可以在目标服务器中执行…

Redis发布、订阅模式(Pub/Sub)详解

Redis发布、订阅模式&#xff08;PUB-SUB&#xff09;详解 Redis的发布订阅&#xff08;Pub/Sub&#xff09;机制是一种消息通信模式&#xff0c;用于消息的广播。它允许多个客户端订阅&#xff08;Subscribe&#xff09;特定的频道&#xff08;Channel&#xff09;&#xff0c…

Docker镜像拉去不了解决方案

原理&工具 使用海外的服务器拉去镜像&#xff0c;压缩为tar包&#xff0c;传输到本地在本地运行 服务器&#xff1a;这里我使用的是AWS的服务器&#xff0c;新用户注册免费使用1年&#xff08;流量超了就不免费了&#xff0c;一般用不完&#xff0c;还有使用 Cloudflare …

【ARM CoreLink 系列 7.2 -- TZC-400 错误状态寄存器使用详细介绍】

文章目录 TZC-400 错误信息使用Fail address low registerFail address high registerFail control registerFail ID registerTZC-400 错误信息使用 Fail address low register 在 ARM TZC-400 设备中,每个过滤单元都有一个 fail_address_low_<x> 寄存器,其中 <x&g…

5.How Fast Should You Be When Learning?(你应该用多快的速度学习? (二))

Are you failing to reach an ideal or you dont know what the ideal is? 你是否没有达到理想状态&#xff0c;或者不知道理想状态是什么? A lot of learing involves having a mental representation of what the ideal performance ought to be, a method or approach t…

【计算机图形学 | 基于MFC三维图形开发】期末考试知识点汇总(下)

文章目录 视频教程第四章 二维变换与裁剪矩阵基础回顾二维几何变换之 平移二维几何变换之 比例二维几何变换之 旋转二维几何变换之 反射复合变换直线裁剪&#xff1a;Cohen-Sutherland 算法直线裁剪&#xff1a;中点分割算法直线裁剪&#xff1a;Liang-Barsky 算法多边形裁剪&a…

github主页这样优化,让人眼前一亮

我的主页&#xff08;一之十六&#xff09; 1. 创建与账户ID同名的仓库 注意&#xff1a;记得勾选Add a README file 2. markdown语法自定义README.md 3. 辅助工具 优秀profile&#xff1a;https://zzetao.github.io/awesome-github-profile/动态文字&#xff1a;https://r…

构建高效业财一体化管理体系

构建高效业财一体化管理体系 业财一体化战略意义 提升决策质量 强化数据支撑&#xff1a;通过整合业务与财务数据&#xff0c;为决策提供准确、实时的信息基础&#xff0c;确保分析的深度与广度。促进业务与财务协同&#xff1a;打破信息孤岛&#xff0c;实现业务流程与财务管…

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例&#xff1a; 首先&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以使用 pip 进行安装&#xff…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构&#xff1a; 如何通过包查找到文件&#xff0c;通过URL对应源码的文件&#xff0c;或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术&#xff0c;pyth…

基于web的产品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于web的产品管理系统,java项目。 ecli…

docker安装rocketMq5x以上的版本

1.背景 安装RocketMQ 5.x以上的版本主要是因为新版本引入了许多性能优化、新功能以及对已有特性的增强&#xff0c;这些改进可以帮助提升消息队列系统的稳定性和效率。 1.性能提升&#xff1a;RocketMQ 5.x版本通常包括了对消息处理速度、吞吐量和延迟的优化&#xff0c;使得系…

【linux 部署 springboot项目】

一、部署项目在linux上 注意&#xff1a; linux的版本是CentOS7.5&#xff0c;云服务器是阿里云。 1.1 用idea打包jar包 1.1.1 在pom.xml中加入打包依赖 <!-- 这个插件&#xff0c;可以将应用打包成一个可执行的jar包 --> <build><plugins><plugin>…

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的&#xff0c;为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的&#xff0c;为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率&#xff0c;但多进程、多线程都存在局限性。比如多进程通过时…

计网之IP

IP IP基本认识 不使用NAT时&#xff0c;源IP地址和目的IP地址不变&#xff0c;只要源MAC和目的MAC地址在变化 IP地址 D类是组播地址&#xff0c;E类是保留地址 无分类地址CIDR 解决直接分类的B类65536太多&#xff0c;C类256太少a.b.c.d/x的前x位属于网路号&#xff0c;剩…

Unity实现简单的MVC架构

文章目录 前言MVC基本概念示例流程图效果预览后话 前言 在Unity中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;框架是一种架构模式&#xff0c;用于分离游戏的逻辑、数据和用户界面。MVC模式可以帮助开发者更好地管理代码结构&#xff0c;提高代码的可维护性…

spring boot初始化的几个总结

spring intializr File->New->Project 注意&#xff1a;Spring Initializer中 Java版本选择模块已经不支持1.8了。 Spring Boot 3.x要求 Java最低版本为17&#xff0c; 最新的SpringBoot版本已经要求Java22了 所以&#xff0c;你可以升级Java版本&#xff0c;使用Spri…