算法训练(leetcode)二刷第三十天 | *46. 携带研究材料(第六期模拟笔试)、416. 分割等和子集

news2024/11/22 11:12:28

刷题记录

  • *46. 携带研究材料(第六期模拟笔试)
    • 二维数组
    • 滚动数组
  • 416. 分割等和子集

*46. 携带研究材料(第六期模拟笔试)

卡码网题目地址

二维数组

01背包问题。用二维数组进行动态规划。

dp[i][j]:访问到第i个物品,在背包容量为j时的最大价值。
初始化:第一个物品在背包容量大于等于其所占空间时的价值为该物品价值。
递推公式:dp[i][j] = max(dp[i-1][j], dp[i][j-cost[i]]+values[i])

其中,

dp[i-1][j]代表上一个物品在容量为j时的最大价值,也就是不把下标为i的物品放入背包;

dp[i][j-cost[i]]+values[i]代表将当前下标为i的物品放入背包,dp[i][j-cost[i]]是获取当背包剩余空间刚好放下当前物品时的最大价值,可以理解为背包腾出当前背包占用空间的大小。

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

// java
import java.util.Scanner;

public class Main{
    
    
    
    public static void main(String[] args){
        int m,n;
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();
        
        // Bag[] bag = new bag[m];
        
        int[] cost = new int[m];
        for(int i=0; i<m; i++) {
            cost[i] = sc.nextInt();
        }
        
        int[] values = new int[m];
        for(int i=0; i<m; i++) {
            values[i] = sc.nextInt();
        }
        
        int[][] dp = new int [m][n+1];
        
        for(int j=cost[0]; j<=n; j++){
            dp[0][j] = values[0];
        }
        
        for(int i=1; i<m; i++){
            for(int j=0; j<=n; j++){
                if(j<cost[i]) {
                    // 当前容量装不下
                    dp[i][j] = dp[i-1][j];
                }else{
                    // 当前容量能装下
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-cost[i]]+values[i]);
                    
                }
            }
        }
        System.out.println(dp[m-1][n]);
    }
}

滚动数组

这里需要主要在遍历背包容量时是倒序。

因为正序遍历容量会导致一个物品被放入多次:
dp[1] = dp[1 - weight[0]] + value[0] = 15

dp[2] = dp[2 - weight[0]] + value[0] = 30

逆序只放一次:
dp[2] = dp[2 - weight[0]] + value[0] = 15 (dp数组已经都初始化为0)

dp[1] = dp[1 - weight[0]] + value[0] = 15

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)

// java
import java.util.Scanner;

public class Main{
    
    
    
    public static void main(String[] args){
        int m,n;
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();
        
        int[] cost = new int[m];
        for(int i=0; i<m; i++) {
            cost[i] = sc.nextInt();
        }
        
        int[] values = new int[m];
        for(int i=0; i<m; i++) {
            values[i] = sc.nextInt();
        }
        
        
        int[] dp = new int [n+1];
        
        for(int i=0; i<m; i++){
            for(int j=n; j>=cost[i]; j--){
                dp[j] = Math.max(dp[j], dp[j-cost[i]] + values[i]);
            }
        }
        System.out.println(dp[n]);
        
    }
}

416. 分割等和子集

leetcode题目地址

回溯法超时。仍然采用01背包的解题思路。先对数组中的所有元素求和,若元素和无法整除2直接返回false。

dp[j]记录中值为j时的最大的元素和。若dp[j]==j则可以拆分为两个和为j的子集。

使用滚动数组依旧是从后向前遍历。

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {
    
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for(int i=0; i<nums.length; i++){
            sum += nums[i];
        }
        if(sum % 2 != 0) return false;
        int mid = sum/2;
        
        
        int[] dp = new int[mid+1];
        for(int i=0; i<nums.length; i++){
            for(int j=mid; j>=nums[i]; j--){
                dp[j] = Math.max(dp[j], dp[j-nums[i]]+nums[i]);
            }
        }
        return dp[mid] == mid;
    }
}

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

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

相关文章

26届JAVA 学习日记——Day14

2024.11.21周四 今天仍然在补充基础知识&#xff0c;项目进度较慢&#xff0c;明天再回顾一下Java8的新特性。 八股 操作系统 什么是缓冲区溢出&#xff1f; 缓冲区溢出是一种常见的计算机安全漏洞&#xff0c;它发生在程序试图将过多的数据写入缓冲区&#xff08;即一块用…

Element UI 组件库详解【Vue】

文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站&#xff0c;element.eleme.cn El…

【腾讯云产品最佳实践】腾讯云CVM入门技术与实践:通过腾讯云快速构建云上应用

目录 前言 什么是腾讯云CVM&#xff1f; 腾讯云CVM的技术优势 基于最佳技术实践&#xff0c;使用腾讯云CVM搭建应用 1. 开通CVM实例 2. 连接CVM实例 3. 配置Web环境 4. 部署PHP应用 腾讯云CVM行业应用案例&#xff1a;电商平台的双十一攻略 1. 弹性伸缩解决高并发问题…

2024信创数据库TOP30之达梦DM8

近年来&#xff0c;中国信创产业快速崛起&#xff0c;其中数据库作为基础软件的重要组成部分&#xff0c;发挥了至关重要的作用。近日&#xff0c;由DBC联合CIW/CIS共同发布的“2024信创数据库TOP30”榜单正式揭晓&#xff0c;汇聚了国内顶尖的数据库企业及产品&#xff0c;成为…

SSA-XGBoost分类预测 | Matlab实现SSA-XGBoost麻雀算法优化XGBoost的多特征分类预测

分类预测 | Matlab实现SSA-XGBOOST麻雀算法优化XGBOOST的多特征分类预测 目录 分类预测 | Matlab实现SSA-XGBOOST麻雀算法优化XGBOOST的多特征分类预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 Matlab实现SSA-XGBoost麻雀算法优化XG

c#编码技巧(十九):各种集合特点汇总

.NET 常用集合对比&#xff1a; .NET 常见的线程安全集合 .NET 只读集合

springboot基于Hadoop的NBA球员大数据分析与可视化(1)(6)

摘 要 科学技术日新月异&#xff0c;人们的生活都发生了翻天覆地的变化&#xff0c;NBA球员大数据分析与可视化系统当然也不例外。过去的信息管理都使用传统的方式实行&#xff0c;既花费了时间&#xff0c;又浪费了精力。在信息如此发达的今天&#xff0c;可以通过网络这个媒…

鸿蒙多线程开发——线程间数据通信对象01

1、线程间通信 线程间通信指的是并发多线程间存在的数据交换行为。由于ArkTS语言兼容TS/JS&#xff0c;其运行时的实现与其它所有的JS引擎一样&#xff0c;都是基于Actor内存隔离的并发模型提供并发能力。 对于不同的数据对象&#xff0c;在ArkTS线程间通信的行为是有差异的&…

goland单元测试

一、单元测试的概念 1.1 什么是单元测试&#xff0c;有什么用&#xff1f; 单元测试是针对于函数的测试&#xff0c;用来保证该函数的逻辑正确性。 1.2 单元测试的要求&#xff1f; 1. 单元测试在正式上线之前应该全部自动执行&#xff0c;并且需要保证全部通过 2. 单元测试需…

ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)

今天介绍一下ArcGIS中定义投影与投影的区别。 给大家解惑一下为什么经常出现自己的数据无法和底图套合的情况。 一 目录 1、ArcGIS定义投影与投影的概念区别 2、ArcGIS定义正确的坐标系 3、ArcGIS动态投影实现套合 4、ArcGIS地理坐标系转投影坐标系&#xff08;错误做法&am…

语义通信论文略读(十七)可变长编码的语义通信+Extended Reality

Semantic Communications With Variable-Length Coding for Extended Reality 用于扩展现实的带可变长度编码的语义通信 作者: Bowen Zhang, Zhijin Qin, Geoffrey Ye Li 所属机构: 伦敦帝国理工学院电气与电子工程系; 清华大学电子工程系 关键词: 扩展现实&#xff0c;联…

IDEA2019搭建Springboot项目基于java1.8 解决Spring Initializr无法创建jdk1.8项目 注释乱码

后端界面搭建 将 https://start.spring.io/ 替换https://start.aliyun.com/ 报错 打开设置 修改如下在这里插入代码片 按此方法无果 翻阅治疗后得知 IDEA2019无法按照网上教程修改此问题因此更新最新idea2024或利用插件Alibaba Clouod Toolkit 换用IDEA2024创建项目 下一步…

网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)

笔记脑图 作业&#xff1a; 1、将虚拟机调整到桥接模式联网。 2、TCP客户端服务器实现一遍。 服务器 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 int mai…

BLIP-2模型的详解与思考

大模型学习笔记------BLIP-2模型的详解与思考 1、BLIP-2框架概述2、BLIP-2网络结构详解3、BLIP-2的几点思考 上一篇文章上文中讲解了 BLIP&#xff08;Bootstrapping Language-Image Pretraining&#xff09;模型的一些思考&#xff0c;本文将讲述一个BLIP的升级版 BLIP-2&am…

strcat的模拟实现(递归)(c基础)

hi &#xff0c; I am 36 适合对象c语言初学者 strcat(arr1,arr2);函数是将arr2接到arr1后&#xff0c;返回arr1 链接介绍一下strcat(c基础)-CSDN博客 下面通过自定义函数来模拟实现 缺陷 该函数不适合arr1[] "";时因为该函数的功能是把arr2接到arr1后&#xf…

GeekChallenge 2024 第十五届极客大挑战 pwn AK

GeekChallenge 2024 第十五届极客大挑战 pwn AK &#x1f340;前言☘️ez_shellcode&#xff08;shellcode&#xff0c;栈溢出&#xff09;&#x1f33f;分析&#x1f33f;解题&#x1f33f;exp ☘️买黑吗喽了吗&#xff08;整数溢出&#xff0c;栈溢出&#xff09;&#x1f3…

springboot源码02-springboot启动主要步骤总结

文章目录 【README】【1】springboot应用启动主要步骤【1.1】springboot应用启动主要步骤总结 【2】springboot应用启动先后发布事件【2.1】springboot启动先后发布事件代码实践【2.1.1】自定义监听器【2.1.2】自定义SpringApplicationRunListener【2.1.3】springboot运行日志 …

数据结构——小小二叉树第二幕(二叉树链式结构的实现以及二叉树的遍历)超详细!!!

文章目录 前言一、实现链式结构二叉树1.1 前中后序遍历1.1.1 遍历规则 1.2 二叉树的结点个数以及高度等 总结 前言 上一篇我们初步认识了树的结构以及概念&#xff0c;同时也学习到了二叉树的顺序结构&#xff08;堆&#xff09;的实现&#xff0c;以及堆的初步应用。 时隔几日…

服务器端渲染 (SSR) 与客户端渲染 (CSR)

嘿程序员&#xff01;我们都知道&#xff0c;新时代的 Javascript 已经彻底改变了现代网站的结构和用户体验。如今&#xff0c;网站的构建更像是一个应用程序&#xff0c;伪装成一个能够发送电子邮件、通知、聊天、购物、支付等的网站。今天的网站是如此先进、互动&#xff0c;…

【spring】spring单例模式与锁对象作用域的分析

前言&#xff1a;spring默认是单例模式&#xff0c;这句话大家应该都不陌生&#xff1b;因为绝大多数都是使用单例模式&#xff0c;避免了某些问题&#xff0c;可能导致对某些场景缺乏思考。本文通过结合lock锁将单例模式、静态变量、锁对象等知识点串联起来。 文章目录 synchr…