当前位置: 首页 > news >正文

算法修炼之筑基篇——筑基一层初期(解决01背包问题)

✨博主:命运之光

专栏:算法修炼之练气篇​​​​​

博主的其他文章:点击进入博主的主页

前言:学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期难度可谓是天差地别,懂得都懂,题目难度相比起练气期的题目难度提升很多,所以要是各位蒟蒻小伙伴们看不懂筑基期的题目可以在练气期多积累积累,练气期的题目也会不断更新,大家一定要把基础打牢固了再来看筑基期的题目哈,这样子也可以提高大家的学习效率,一举两得,加油(●'◡'●)🎉🎉

目录

✨经典的01背包问题

🍓小明的背包1 

🍓解题代码

🍓dp数组打表如下:

​编辑 ✨经典01背包问题的解题思路

✨01背包的递推公式(重要需要记忆)

✨01背包的递推公式优化为一维数组(重要需要记忆)


✨经典的01背包问题

让我们先看一道经典的01背包问题

🍓小明的背包1 

 

🍓解题代码

#include<bits/stdc++.h>
using namespace std;
int wi[105],vi[105],dp[1005][1005];
int main()
{int n,v;//n为行数,v为背包的大小cin>>n>>v;//传入n,v的值for(int i=1;i<=n;i++){cin>>wi[i]>>vi[i];//传入重量和价值 }//写dp数组int i,j;for(i=1;i<=n;i++){for(j=1;j<=v;j++){if(j<wi[i]){dp[i][j]=dp[i-1][j];//如果重量没j大的话,就直接继承dp数组上一列的最优解,直接dp[i-1][j]即可 }else{//若是比j大则进行比较,这道题标准的01背包问题,直接套用01背包推出的公式即可 dp[i][j]=max(dp[i-1][j],dp[i-1][j-wi[i]]+vi[i]);	} }} cout<<dp[n][v];return 0;
}

🍓dp数组打表如下:

 ✨经典01背包问题的解题思路

在C/C++中,可以使用动态规划来解决01背包问题。动态规划是一种常用的解决优化问题的算法思想,它通过将问题分解为子问题,并利用子问题的解来构建更大规模的问题的解。

以下是使用动态规划解决01背包问题的基本步骤:

  1. 定义问题:我们需要确定背包的容量和物品的重量和价值。假设背包的容量为C,有n个物品,每个物品的重量为w[i],价值为v[i]。

  2. 创建一个二维数组dp[n+1][C+1],其中dp[i][j]表示在前i个物品中,背包容量为j时的最大价值。

  3. 初始化边界条件:当物品数量为0或背包容量为0时,最大价值都为0,即dp[i][0] = dp[0][j] = 0。

  4. 递推关系:对于每个物品i,我们有两种选择:放入背包或不放入背包。如果选择放入背包,那么当前的最大价值为dp[i][j] = dp[i-1][j-w[i]] + v[i];如果选择不放入背包,那么当前的最大价值为dp[i][j] = dp[i-1][j]。我们选择两者中的较大值作为dp[i][j]的值。

  5. 递推计算:使用循环遍历物品和背包容量,根据递推关系计算dp[i][j]的值。

  6. 返回结果:dp[n][C]即为问题的解,表示在前n个物品中,背包容量为C时的最大价值。

🍓下面是一个示例代码,演示了如何使用动态规划解决01背包问题:

#include <iostream>
using namespace std;int knapsack(int C, int weights[], int values[], int n) {int dp[n + 1][C + 1];// 初始化边界条件for (int i = 0; i <= n; i++)dp[i][0] = 0;for (int j = 0; j <= C; j++)dp[0][j] = 0;// 计算最大价值for (int i = 1; i <= n; i++) {for (int j = 1; j <= C; j++) {if (weights[i - 1] <= j) {dp[i][j] = max(values[i - 1] + dp[i - 1][j - weights[i - 1]], dp[i - 1][j]);} else {dp[i][j] = dp[i - 1][j];}}}return dp[n][C];
}int main() {int C = 10;  // 背包容量int weights[] = {2, 3, 4, 5};  // 物品重量int values[] = {3, 4, 5, 6};   // 物品价值int n = sizeof(weights) / sizeof(weights[0]);  // 物品数量int max_value = knapsack(C, weights, values, n);cout << "最大价值:" << max_value << endl;return 0;
}

在这个示例中,背包的容量C为10,有4个物品,重量分别为2、3、4和5,价值分别为3、4、5和6。运行程序将输出最大价值为10,即当背包容量为10时,从这些物品中选择可以得到的最大价值。你可以根据实际情况修改输入的背包容量、物品重量和价值,来解决不同的01背包问题。

✨01背包的递推公式(重要需要记忆)

dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])

其中,dp[i][j]表示在前i个物品中,背包容量为j时的最大价值,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。

递推公式的含义是,在考虑第i个物品时,我们有两种选择:

  1. 不选择第i个物品,即仅考虑前i-1个物品,此时的最大价值为dp[i-1][j]
  2. 选择第i个物品,那么背包的容量就会减少,变为j-w[i],此时的最大价值为dp[i-1][j-w[i]] + v[i],即在考虑前i-1个物品、背包容量为j-w[i]时的最大价值,再加上第i个物品的价值v[i]。

我们选择上述两种选择中的较大值作为dp[i][j]的值,即表示在考虑前i个物品、背包容量为j时的最大价值。

需要注意的是,上述递推公式中的dp数组是一个二维数组,大小为(n+1) x (C+1),其中n表示物品的数量,C表示背包的容量。初始化时,需要设置边界条件,即dp[0][j] = dp[i][0] = 0,表示当物品数量为0或背包容量为0时的最大价值为0。

✨01背包的递推公式优化为一维数组(重要需要记忆)

dp[j] = max(dp[j], dp[j-w[i]] + v[i])

其中,dp[j]表示背包容量为j时的最大价值,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。

相关文章:

算法修炼之筑基篇——筑基一层初期(解决01背包问题)

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法修炼之练气篇​​​​​ ✨博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了&#xff0c;下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期…...

JVM的空间结构

目录 一、概述 二、分类 1.程序计数器区域(Program Counter Register)&#xff1a; 2.Java虚拟机栈(Stack)&#xff1a; 3.堆区(Heap)&#xff1a; 4.方法区(Method Area)&#xff1a; 5.本地方法栈(Native Method Stack)&#xff1a; 一、概述 JVM分为5个主要区域&…...

图像分割的常用算法

图像分割是指将一幅图像划分成多个子区域或像素集合的过程&#xff0c;其中每个子区域或像素集合具有一定的统计特征或语义信息。图像分割是图像处理中的基础任务&#xff0c;其应用涵盖了医学影像、计算机视觉、机器人技术等多个领域。常用的图像分割算法包括&#xff1a; 1.…...

AI歌手真的可以吗

你听过AI歌手吗&#xff1f;近日&#xff0c;“AI孙燕姿”火遍全网&#xff0c;AI孙燕姿翻唱林俊杰的《她说》、周董的《爱在西元前》、赵雷的《成都》等等歌曲让网友听了直呼&#xff1a;“听了一晚上&#xff0c;出不去了。”你认为AI歌手会取代流行歌手成为主流吗&#xff1…...

Kubernetes高级存储

Kubernetes高级存储 PV PVC k8s支持的存储系统很多&#xff0c;全部掌握不现实。为了屏蔽底层存储实现的细节&#xff0c;方便用户使用&#xff0c;k8s引入PV和PVC两种资源对象。 PV(Persistent Volume)持久化卷&#xff0c;对底层共享存储的抽象&#xff0c;一般由k8s管理员进…...

云原生之使用Docker部署docker-compose-ui工具

云原生之使用Docker部署docker-compose-ui工具 一、Docker Compose UI介绍二、检查本地docker环境1.检查系统版本2.检查docker状态 三、下载Docker Compose UI镜像四、部署Docker Compose UI服务1.新建安装目录2.创建Docker Compose UI容器3.检查Docker Compose UI容器状态4.查…...

文心一言 vs GPT4

本周真是科技爱好者的狂欢节。GPT4和文心一言接连发布&#xff0c;AI工具已经开始走进千家万户。 拿文心一言发布会上的几个问题调戏了 GPT4 一下&#xff0c;看看表现如何。 第一个为文心的回答&#xff0c;第二个为GPT4 的回答。 1. 可以总结一下三体的核心内容吗&#xf…...

Tcl-5. format 命令

format 命令和 C 语言中的 printf 和 sprintf 命令类似。它根据一组格式说明来格式化字符 串。此命令不会改变被操作字符串的内容。 [语法]&#xff1a;format spec value1 value2 ... spec 变元包含了格式说明关键词和附加文字。使用%来引入一个关键词&#xff0c;后跟 0 个…...

BloombergGPT: 首个金融垂直领域大语言模型

BloombergGPT: 首个金融垂直领域大语言模型 Bloomberg 刚刚发布了一篇研究论文&#xff0c;详细介绍了他们最新的突破性技术 BloombergGPT。BloombergGPT是一个大型生成式人工智能模型&#xff0c;专门使用大量金融数据进行了训练&#xff0c;以支持金融行业自然语言处理 (NLP…...

CMake深度解析:掌握add_custom_command,精通Makefile生成规则

CMake深度解析&#xff1a;掌握add_custom_command&#xff0c;精通Makefile生成规则 1. CMake简介与基础知识1.1 CMake的基本概念&#xff08;CMake Basic Concepts&#xff09;1.1.1 项目&#xff08;Project&#xff09;1.1.2 目标&#xff08;Target&#xff09;1.1.3 命令…...

基于Yolov5目标检测的物体分类识别及定位(二) -- yolov5运行环境搭建及label格式转换

刚开始跟着网上的教程做&#xff0c;把环境安装错了&#xff0c;后来直接用GitHub的官方教程来安装环境。 地址是yolov5官方团队代码及教程&#xff0c;看readme文件就可以。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集…...

Office project 2019安装

哈喽&#xff0c;大家好。今天一起学习的是project 2019的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…...

【leetcode-mysql】1251. 平均售价

题目&#xff1a; Table: Prices ---------------------- | Column Name | Type | ---------------------- | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------------- (product_id&#xff0c;start_date&#xff0c;end_dat…...

Razor代码复用

1.布局&#xff08;Layout&#xff09;复用 Layout的使用&#xff0c;就像WebForm的模板页一样&#xff0c;甚至会更加简单&#xff0c;更加方便和明了。 要使用Layout&#xff0c;首先要在模板页相应的位置添加RenderBody()方法&#xff1a; <!DOCTYPE html><html la…...

PRL:上海交大张文涛团队实现量子材料相关突破

来源&#xff1a;上海交通大学 近期&#xff0c;上海交通大学物理与天文学院张文涛研究组利用自行研制的高能量和高时间分辨率角分辨光电子能谱系统对量子材料1T-TiSe₂电子结构进行了超快激光操控研究。利用超快光激发与电荷密度波相有关的相干声子&#xff0c;引起晶格内原子…...

impala中group_concat()函数无法对内容进行order by

描述&#xff1a; 使用的是impala数据库&#xff0c;假设有四笔数据&#xff0c;是无序的&#xff0c;业务上要求将其行转列成一行数据&#xff0c;并且里面的数据要按从小到大排序。 过程&#xff1a; 猜测&#xff1a; 数据库Oracle、Mysql、MSsql等支持group_concat中使…...

MySQL 数据库全局变量中文解释

NameValueauto_increment_incrementAUTO_INCREMENT 字段值的自增长步长值。auto_increment_offsetAUTO_INCREMENT 字段值的初始值。autocommit指示新连接的默认提交模式是否启用。automatic_sp_privileges控制是否在存储过程上创建或更改时自动分配特定权限。back_log在开始拒绝…...

设计模式之~状态模式

状态模式&#xff08;State&#xff09;&#xff0c;当一个对象的内部状态改变时允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 能够让程序根据不同的外部情况来做出不同的响应&#xff0c;最直接的方法就是在程序中将这些 可能发生的外部情况全部考虑到&#xff…...

【21JavaScript break 和 continue 语句】JavaScript中的break和continue语句:控制循环流程的关键技巧

JavaScript break 和 continue 语句 在JavaScript中&#xff0c;break和continue是两个关键字&#xff0c;用于控制循环结构的执行流程。 break语句 break语句用于中断循环并跳出循环体&#xff0c;使程序执行流程继续到循环之后的下一行代码。 在for循环中使用break for (…...

【SpringBoot】 设置随机数据 用于测试用例

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 设置随机数据——常用于测试用例 SpringBoot设…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...