卡码网 46携带研究材料 LeetCode 416分割等和数组 1049最后一块石头的重量-ii | 代码随想录25期训练营day42、43

动态规划算法4

卡码网 46 携带研究材料 2023.12.6

  • 题目链接
  • 常规二维dp数组方法代码随想录讲解[链接]
  • 一维滚动数组方法代码随想录讲解[链接]
    在这里插入图片描述
//二维dp数组做法
#include<bits/stdc++.h>
using namespace std;

int main()
{
    //m为材料种类数,n为行李箱最大空间数
    int m, n;
    cin >> m >> n;
    //room数组存储m种材料所占的体积
    vector<int> room(m, 0);
    for(int i = 0; i < m; i++)
        cin >> room[i];
    //value数组存储m种材料所占的价值
    vector<int> value(m, 0);
    for(int i = 0; i < m; i++)
        cin >> value[i];
    //1确定动态规划dp数组及其下标含义,这里指第(1, m)种材料(对应索引0,m-1)在占用(0, n)体积时的价值
    vector<vector<int>> dp(m, vector<int>(n+1, 0));
    //3初始化,存储第一种材料的价值,背包体积大于room[0]时,背包的价值为value[0]
    //下面是两种初始化方法
    for(int i = room[0]; i <= n; i++)
    {
        dp[0][i] = value[0];
    }
    // for(int i = 1; i < n; i++)
    // {
    //     if(room[0] <= i)
    //         dp[0][i] = value[0];
    // }
    //2确定递推公式 4 确定递推遍历顺序
    for(int i = 1; i < m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            //当背包体积不够时,不装第i种材料,此时最大价值为dp[i-1][j]背包的价值
            if(room[i] > j)
                dp[i][j] = dp[i-1][j];
            //当背包体积够时,取价值最大值,不装第i种材料的价值,装第i种材料的价值+背包剩余体积装材料的最大价值
            else
                dp[i][j] = max(dp[i-1][j],dp[i-1][j-room[i]]+value[i]);
        }
    }
    //dp[m-1][n]表示m种材料装在n体积背包的最大价值
    cout << dp[m-1][n] << endl;
    return 0;
}
//一维dp数组做法(滚动数组)
#include<bits/stdc++.h>
using namespace std;

int main()
{
    //m为材料种类数,n为行李箱最大空间数
    int m, n;
    cin >> m >> n;
    //room数组存储m种材料所占的体积
    vector<int> room(m, 0);
    for(int i = 0; i < m; i++)
        cin >> room[i];
    //value数组存储m种材料所占的价值
    vector<int> value(m, 0);
    for(int i = 0; i < m; i++)
        cin >> value[i];
    //1确定动态规划dp数组及其下标含义,这里指占用[0, n]体积时的价值
    vector<int> dp(n+1, 0);
    //3初始化,存储第一种材料的价值,背包体积大于room[0]时,背包的价值为value[0]
    //2确定递推公式 4 确定递推遍历顺序
    //遍历m种材料
    for(int i = 0; i < m; i++)
    {
        //倒序遍历[room[i], j]体积下的最大价值
        //不能用正序遍历,否则dp[2]会重复dp[1]
        for(int j = n; j >= room[i]; j--)
        {
            //递推公式,取两者最大值
            //dp[j](前面遍历的该体积下的最大价值),
            //dp[j-room[i]]+value[i],j-room[j]空间大小下的最大价值+第i种材料的价值
            dp[j] = max(dp[j], dp[j-room[i]]+value[i]);
        }
    }
    //dp[n]表示n体积背包的最大价值
    cout << dp[n] << endl;
    return 0;
}

LeetCode 416 分割等和数组 2023.12.6

  • 题目链接
  • 代码随想录讲解[链接]
    在这里插入图片描述
bool canPartition(vector<int>& nums) {
    //sum存储nums数组的总和
    int sum = 0;
    // for (int i = 0; i < nums.size(); i++)
    //     sum += nums[i];
    //求和或拼接函数(迭代器,迭代器,累加值i),sum=数组和+i
    sum = accumulate(nums.begin(), nums.end(), 0);
    cout << sum << endl;
    //先判断和是否为偶数,如果不是则不能分为两个等和数组,直接返回false
    if(sum%2 == 1)
        return false;
    //和为偶数时,两个等和数组的和目标值为一半和
    int target = sum/2;
    //1确定dp数组,其下标含义为当前背包下的最大子数组和,3初始化元素都为0
    //因为数组元素最大值100,数组大小最大为100,那么最大target为10000
    vector<int> dp(10001, 0);
    //2确定递推公式,4确定遍历顺序,数组中每个元素只使用一次,那么倒序遍历
    for (int i = 0; i < nums.size(); i++)
    {
	    //j为背包的大小,需要大于当前遍历值
        for(int j = target; j >= nums[i]; j--)
            //取极大值:判断之前遍历的元素在背包j值时的最大元素和与加入该值后的最大元素和
            dp[j] = max(dp[j], dp[j-nums[i]]+nums[i]);
    }
    //最终判断条件,在能存储数值为target的背包内值为target时,说明能分为两个等和数组
    if(dp[target] == target)
        return true;
    return false;
}

LeetCode 1049 最后一块石头的重量-ii 2023.12.6

  • 题目链接
  • 代码随想录讲解[链接]
    在这里插入图片描述
int lastStoneWeightII(vector<int>& stones) {
    //sum存储石头总重量
    int sum = accumulate(stones.begin(), stones.end(), 0);
    //target存储一半石头总重量,当总重量为奇数时,2*target<sum
    int target = sum/2;
    //1确定dp数组,其下标含义为能存储重量为i的背包最大能存储石头重量
    //本题中想把石头分为重量相同或者相近的两堆,这样最后剩下的石头重量为0或者最小
    //3初始化元素均为0
    vector<int> dp(target+1, 0);
    //2确定递推公式,4确定遍历顺序
    //计算重量为i的背包最大能存储石头重量,每块石头只能用一次所以倒序遍历
    for (int i = 0; i < stones.size(); i++)
    {
        //j为背包的大小,需要大于当前遍历重量值
        for(int j = target; j >= stones[i]; j--)
            //取极大值:判断之前遍历的元素在背包j值时的最大重量和与加入该重量值后的最大重量和
            dp[j] = max(dp[j], dp[j-stones[i]]+stones[i]);
    }
    //能存储target一半总重量的背包最多能存储target重量或者更少
    //sum-dp[target]为另一堆更多的重量,减掉dp[target]即为最小重量;相同时答案为0
    return sum - dp[target] - dp[target];
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手眼标定 - 最终精度和误差优化心得

手眼标定 - 标定误差优化项 一、TCP标定误差优化1、注意标定针摆放范围2、TCP标定时的点次态与工作姿态尽可能保持相近 二、深度相机对齐矩阵误差1、手动计算对齐矩阵 三、手眼标定拍照姿态1、TCP标定姿态优先2、水平放置棋盘格优先 为减少最终手眼标定的误差&#xff0c;可做或…

首次发布亚马逊云科技生成式AI技术堆栈,re:Invent大会重磅发布

亚马逊云科技总是在不断重构&#xff0c;以推动创新&#xff0c;而今年re:Invent的主角毫无疑问是生成式AI。这从亚马逊云科技副总裁、首席布道师Jeff Barr在re:Invent 2023之前就迫不及待地写了一篇关于PartyRock的体验试玩教程即可窥见一斑。 事实也确实如此。在Las Vegas&am…

什么是HTML?

✨前言✨ 本文主要介绍什么是HTML以及W3C &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 文章目录 什么是HTMLHTML发展史HTML的特点什么…

编程怎么学才能快速入门,分享一款中文编程工具快速学习编程思路,中文编程工具之分组框构件简介

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

Linux权限命令详解

Linux权限命令详解 文章目录 Linux权限命令详解一、什么是权限&#xff1f;二、权限的本质三、Linux中的用户四、linux中文件的权限4.1 文件访问者的分类&#xff08;人&#xff09;4.2 文件类型和访问权限&#xff08;事物属性&#xff09; 五、快速掌握修改权限的做法【第一种…

windows下分卷解压文件

我的文件是这样的&#xff1a; 存放路径为&#xff1a;C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd&#xff1a; 第一步&#xff1a;cd /path/o/分卷问文件目录 第二步&#xff1a; 执行之后的结果(红色框出来的)&#xff1a; …

如何掌握构建 LMS 网站的艺术

目录 什么是学习管理系统 (LMS) 在线课程和 LMS 网站的好处 为什么 WordPress 对于 LMS 网站很重要 统一学习中心 多功能性和可扩展性 提高教育参与度 简化管理和监控 节省时间和费用 技能评估和绩效监督 持续学习和技能提升 使用 WordPress 插件构建成功的 LMS 课程 专注于您的…

力扣257. 二叉树的所有路径(递归回溯与迭代)

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

【小白专用】Sql Server 连接Mysql 更新23.12.09

目标 已知mysql连接参数&#xff08;地址和用户&#xff09;&#xff0c;期望通过Microsoft Sql Server Management Studio &#xff08;以下简称MSSSMS&#xff09;连接Mysql&#xff0c;在MSSSMS中直接查询或修改Mysql中的数据。 一般是选最新的版本下载。 选64位还是32位&a…

java--包装类

1.包装类 ①包装类就是把基本类型的数据包装成对象。 ②自动装箱&#xff1a;基本数据类型可以自动转换为包装类型。 ②自动拆箱&#xff1a;包装类型可以自动转换为基本类型。 2.包装类的其他常见操作 ①可以把基本类型的数据换成字符串类型。 ②可以把字符串类型的数值转…

轻量封装WebGPU渲染系统示例<45>- 材质组装流水线(MaterialPipeline)灯光、阴影、雾(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MaterialPipelineFog.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class MaterialPipelineFog {pr…

9.MySQL 索引

目录 ​​​​​​​概述 概念&#xff1a; 单列索引 普通索引 创建索引 查看索引 删除索引 唯一索引 创建唯一索引 删除唯一索引 主键索引 组合索引 创建索引 全文索引 概述 使用全文索引 空间索引 内部原理 相关算法&#xff1a; hash算法 二叉树算法 …

阿里二面:消息队列的事务消息可以用 TCC 模式实现吗?

大家好&#xff0c;我是君哥。 消息队列的主要功能是系统间解耦&#xff0c;实现流量的削峰填谷。主流的消息队列一般有三个核心操作&#xff1a;消费者发送消息&#xff0c;Broker 保存消息&#xff0c;消费者消费消息。如下图&#xff1a; 对于一个完整的事务消息&#xff0…

【Angular 开发】Angular 信号的应用状态管理

自我介绍 做一个简单介绍&#xff0c;年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【架构…

基于PaddleOCR银行卡识别实现(四)之uni-app离线插件

目的 在前三篇文章中完成了银行卡识别整个模型训练等工作&#xff0c;通过了解PaddleOCR的端侧部署&#xff0c;我们也可以将银行卡号检测模型和识别模型移植到手机中&#xff0c;做成一款uni-app手机端离线银行卡号识别的应用。 准备工作 为了不占用过多篇幅&#xff0c;这…

内存学习——堆(heap)

目录 一、概念二、自定义malloc函数三、Debug运行四、heap_4简单分析4.1 heap管理链表结构体4.2 堆初始化4.3 malloc使用4.4 free使用 一、概念 内存分为堆和栈两部分&#xff1a; 栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO&#xff09;的数据结构&…

class072 最长递增子序列问题与扩展【算法】

class072 最长递增子序列问题与扩展【算法】 code1 300. 最长递增子序列 // 最长递增子序列和最长不下降子序列 // 给定一个整数数组nums // 找到其中最长严格递增子序列长度、最长不下降子序列长度 // 测试链接 : https://leetcode.cn/problems/longest-increasing-subsequen…

【Java 基础】29 序列化

文章目录 1.定义2.目的3.使用1&#xff09;序列化2&#xff09;反序列化 3.应用场景4.注意事项总结 1.定义 序列化&#xff08;Serialization&#xff09;是将对象的状态转换为字节流的过程&#xff0c;以便将其存储到文件、数据库或通过网络传输 说简单点&#xff0c;序列化就…

关于DNS服务器地址总是127.0.0.1且无法解析域名地址

问题 笔者尝试nslookup解释域名时&#xff0c;出现服务器变成本地环回口地址&#xff0c;导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…