代码随想录Day42 | 背包问题理论 416. 分割等和子集

代码随想录Day42 | 背包问题理论 416. 分割等和子集

  • 二维dp解决背包问题
  • 一维dp求解背包问题
  • 46.携带研究材料
    • 二维dp
    • 一维dp
  • 416.分割等和子集

二维dp解决背包问题

文档讲解:代码随想录
视频讲解: 带你学透0-1背包问题
状态

利用五部曲来分析二维dp是如何解决背包问题的。

  1. dp[i][j]的含义
    i表示当前第i个物品,j表示背包的容量,dp[i][j]表示从0~i个物品中选取并放入容量为j的背包的价值最大和
  2. 递推公式
    主要有两种情况:
    • 放入第i个物品超重,即当前的容量小于i的重量,那么dp[i][j] = dp[i-1][j]
    • 放入第i个物品不超重,dp[i][] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
  3. 初始化
    • 考虑dp[i][0]:表示容量为0的背包的最大价值为0
    • 考虑dp[0][j]: 表示容量为0~j的背包,放入0号物品应该有的价值
    • 其余位置初始化为0
  4. 遍历顺序
    先背包再物品,或者先物品再背包都可以。
    主要是都要从左上角向dp[i][j]计算
  5. 打印dp数组

一维dp求解背包问题

文档讲解:代码随想录
视频讲解:

状态

本质是对递推公式的考虑进行修改,对于原始的二维dp,dp[i-1][j]来表示上一层的最大价值,上一层可以重复利用,那么直接拷贝到当前层就可以,这样就会少一阶数组。
对于1维的dp,五部曲分析

  1. dp[j]
    j表示背包容量,dp[j]就表示背包在当前容量下的最大价值
  2. 递推公式
    j容量的背包还是考虑是否可以继续装下重量为weight[i]的物品
    dp[j] = max(dp[j],dp[j-weight[i]]+value[i])
  3. 初始化
    对于dp[0],那就是容量为0的背包价值就是0,
    对于dp[j],如果物品价值都是正整数,那么应当初始化为0
  4. 遍历顺序
    双层遍历,先物品再背包,背包必须倒序遍历。主要是为了避免重复计算物品数量。
    本质都是右下角的值是通过左上角得到的。但对于一维dp,相当于是右边的值需要左边值来更新。
  5. 打印dp数组

46.携带研究材料

文档讲解:代码随想录
视频讲解:

状态

二维dp

#include <iostream>
#include <vector>int main()
{int M,N;std::cin >> M >> N;//输入材料所占空间std::vector<int> weight(M,0);for(int i = 0;i<M;i++){std::cin >> weight[i];}//输入材料价值std::vector<int> value(M,0);for(int i = 0;i<M;i++){std::cin >> value[i];}//创建二维dpstd::vector<std::vector<int>> dp(M+1,std::vector<int>(N+1,0));//初始化dpfor(int j = 0;j<N+1;j++){if(j<weight[0]){dp[0][j] = 0;}else{dp[0][j] = value[0];}}//遍历for(int i =1;i<M+1;i++){for(int j = 0;j<N+1;j++){if(j<weight[i]){dp[i][j] = dp[i-1][j];}else{dp[i][j] = std::max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);}}}std::cout << dp[M][N];
}

一维dp

#include <iostream>
#include <vector>int main()
{int M,N;std::cin >> M >> N;//输入材料所占空间std::vector<int> weight(M,0);for(int i = 0;i<M;i++){std::cin >> weight[i];}//输入材料价值std::vector<int> value(M,0);for(int i = 0;i<M;i++){std::cin >> value[i];}//创建一维dpstd::vector<int> dp(N+1,0);//初始化  全部为0//遍历for(int i = 0;i<M+1;i++){for(int j = N;j>=weight[i];j--){dp[j] = std::max(dp[j],dp[j-weight[i]]+value[i]);}}std::cout<<dp[N];
}

416.分割等和子集

文档讲解:代码随想录
视频讲解: 动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集
状态

如何转换为背包问题

  • 本题求解就是在数组中搜索元素(物品)然后它们的和为sum/2(价值)
  • 重量如何确定–重量就是价值,当重量和价值相等时表示能够搜索到。即背包正好装满

五部曲

  1. dp[j]
    j表示当前重量,dp[j]表示当前重量下的价值和。
    j容量的背包还是考虑是否可以继续装下重量为weight[i]的物品
  2. 递推关系
    dp[j] = max(dp[j],dp[j-weight[i]]+value[i])
  3. 初始化
    对于dp[0],那就是容量为0的背包价值就是0
  4. 遍历顺序
    先物品再背包,背包倒序
  5. 打印dp
    在这里插入图片描述
//求和为sum/2的元素和
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;int target = sum/2;//dp数组vector<int> dp(target+1,0);//初始化都为0, 全为正整数for(int i = 0;i<nums.size();i++){for(int j = target;j>=nums[i];j--){//nums[i]为重量 也为价值dp[j] = max(dp[j],dp[j-nums[i]]+nums[i]);}}if(dp[target] == target) return true;return false;}
};

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

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

相关文章

CF1404BTree Tag/ BZOJ0487. 树上追逐详解

1.题目 传送门:Tree Tag - 洛谷 2.思路 我们考虑什么情况下Alice可以获胜. 如果​ ≤ da&#xff0c;则Alice可以一步就追上Bob. 如果Alice处在一个能覆盖整棵树的点&#xff0c;即2da 1≥树的直径&#xff0c;那么Bob也无论走到哪里Alice都能追到,Alice获胜. 其它情况下…

string容器

#include<iostream> using namespace std; //string的构造函数 void test01() {string s1;//默认构造const char *str"holle word";string s2(str);cout<<"s2"<<s2<<endl;string s3(s2);cout<<"s3"<<s3<…

【Vitis】基于C++函数开发组件的步骤

目录 基本步骤 关键领域 • 硬件接口&#xff1a; 任务级并行度&#xff1a; 存储器架构&#xff1a; 微观级别的最优化&#xff1a; 基本步骤 1. 基于 设计原则 建立算法架构。 2. &#xff08;C 语言仿真&#xff09; 利用 C/C 语言测试激励文件验证 C/C 代码的逻辑。…

六轴机器人奇异点

1 奇异点说明 有着6个自由度的KUKA机器人具有3个不同的奇点位置。即便在给定状态和步骤顺序的情况下,也无法通过逆向变换(将笛卡尔坐标转换成极坐标值)得出唯一数值时,即可认为是一个奇点位置。这种情况下,或者当最小的笛卡尔变化也能导致非常大的轴角度变化时,即为奇点位置…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItem组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之MenuItem组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItem组件 用来展示菜单Menu中具体的item菜单项。 子组件 无 接口 Menu…

C语言贪吃蛇详解

个人简介&#xff1a;双非大二学生 个人博客&#xff1a;Monodye 今日鸡汤&#xff1a;人生就像一盒巧克力&#xff0c;你永远不知道下一块是什么味的 C语言基础刷题&#xff1a;牛客网在线编程_语法篇_基础语法 (nowcoder.com) 一.贪吃蛇游戏背景 贪吃蛇是久负盛名的游戏&…

如何决定K8S Pod的剔除优先级

在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;当节点资源面临压力时&#xff0c;如何决定Pod的优先级是一个关键问题。在Kubernetes 1.8版本之后&#xff0c;引入了基于Pod优先级的调度策略&#xff0c;即Pod Priority Preemption。这种策略允许在资源不足的情况下&a…

6-2、T型加减速计算简化【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍简化T型加减速计算过程&#xff0c;使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 根据上一节内容已知 常用的晶振大小…

3dmatch-toolbox详细安装教程-Ubuntu14.04

3dmatch-toolbox详细安装教程-Ubuntu14.04 前言docker搭建Ubuntu14.04安装第三方库安装cuda/cundnn安装OpenCV安装Matlab 安装以及运行3dmatch-toolbox1.安装测试3dmatch-toolbox(对齐两个点云) 总结 前言 paper:3DMatch: Learning Local Geometric Descriptors from RGB-D Re…

基于单片机的智能寻光小车设计

摘 要&#xff1a;随着物联网技术的飞速发展和逐渐成熟&#xff0c;以单片机为主的智能小车在巡查、仓储、探险及国防等领域得到广泛应用。本文设计了一种基于单片机的智能寻光小车&#xff0c;该小车以STC89C52RC 芯片为设计核心&#xff0c;结合光敏传感器和超声波传感器等多…

初识C语言·编译与链接

1 翻译环境和运行环境 C语言标准ANSI C 实现C语言代码的时候 一般需要经过两种环境&#xff0c;一是翻译环境&#xff0c;二是运行环境&#xff0c;计算机能识别的是二进制的指令&#xff0c;人写完代码后通过翻译环境&#xff0c;使代码变成计算机能读懂的可执行的机器指令&a…

MySQL组复制的介绍

前言 本文介绍关于MySQL组复制的背景信息和基本原理。包括&#xff0c;介绍MySQL传统复制方法的原理和隐患、介绍组复制的原理&#xff0c;单主模式和多主模式等等。通过结合原理图学习这些概念&#xff0c;可以很好的帮助我们理解组复制技术这一MySQL高可用方案&#xff0c;有…

ChatGPT 4.0 升级指南, ChatGPT Plus(GPT 4.0) 有何优势?

1.ChatGPT 是什么&#xff1f; ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人&#xff0c;它基于强大的语言处理模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;构建。它能够理解人类语言&#xff0c;可以为我们解决实际的问题。 ChatGPT 4.…

关于网络面试题汇总

什么是TCP/IP五层模型&#xff1f;它们的作用是啥&#xff1f;基于TCP/IP实现的应用&#xff08;层协议&#xff09;有哪些&#xff1f; TCP/IP五层模型&#xff0c;从上向下分别是&#xff1a; 应用层&#xff1a;应用程序本身&#xff0c;应用层的作用是负责应用程序之间的…

python使用fabric库

目录 一&#xff1a;介绍 二&#xff1a;远程命令执行 三&#xff1a;文件上传&#xff0c;下载 四&#xff1a;执行多台服务器命令 一&#xff1a;介绍 Fabric是一个Python库&#xff0c;用于简化SSH连接和自动化任务。它提供了一个简单的API来执行远程命令、上传和下载文…

京东广告算法架构体系建设--大规模稀疏场景高性能训练方案演变

一、前言 京东广告训练框架随着广告算法业务发展的特点也在快速迭代升级&#xff0c;回顾近几年大致经历了两次大版本的方案架构演变。第一阶段&#xff0c;随着2016年Tensorflow训练框架的开源&#xff0c;业界开始基于Tensorflow开源框架训练更复杂的模型。模型对特征规模和…

ctfshow——文件包含

文章目录 web 78——php伪协议第一种方法——php://input第二种方法——data://text/plain第三种方法——远程包含&#xff08;http://协议&#xff09; web 78——str_replace过滤字符php第一种方法——远程包含&#xff08;http://协议&#xff09;第二种方法——data://&…

Visual Studio 2010+C#实现信源和信息熵

1. 设计要求 以图形界面的方式设计一套程序&#xff0c;该程序可以实现以下功能&#xff1a; 从输入框输入单个或多个概率&#xff0c;然后使用者可以通过相关按钮的点击求解相应的对数&#xff0c;自信息以及信息熵程序要能够实现马尔可夫信源转移概率矩阵的输入并且可以计算…

电商推荐系统

此篇博客主要记录一下商品推荐系统的主要实现过程。 一、获取用户对商品的偏好值 代码实现 package zb.grms;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Doub…