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

【代码训练营】day42 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

所用代码 java

最后一块石头的重量II LeetCode 1049

题目链接:最后一块石头的重量II LeetCode 1049 - 中等

思路

无。


把石头分成重量总和近似两堆,然后两堆石头相撞,剩下的就是最小的石头。每个石头只能用一次,01背包!

  • dp[j] : 装满容量为 j 背包,最大重量为dp[j]
  • 递推公式:dp[j] = max(dp[j], dp[j-stones[i]] + stones[i])
  • 初始化:dp[0] = 0,非零下标 0 背包容量由题意,最多30块石头,每个价值不超过100,所以容量最大3000/2= 1500,即背包的容量可以定义为dp[1501]
  • 遍历方向:0<=i<stones.length target<=j<=stone[i]
class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for (int stone : stones) {sum += stone;}int target = sum / 2; // 向下取整// leetcode最大3000int[] dp = new int[1501];for (int i = 0; i < stones.length; i++) {for (int j = target; j >= stones[i]; j--) {dp[j] = Math.max(dp[j], dp[j-stones[i]] + stones[i]);}}// 由于target是向下取整的,所以// 大的一堆:sum - dp[target] 小的一堆: dp[target]return sum - dp[target] - dp[target];}
}

二维数组:

  • dp[i] [j]: 放[0 - i]个石头,在背包容量为j的情况下的最大重量
  • 初始化: dp[i] [0]背包为零,重量为零 , dp[0] [j] 下标为0的石头取决于背包大于等于stones[0]时可以装下
class Solution {public int lastStoneWeightII(int[] stones) {int sum = 0;for (int stone : stones) {sum += stone;}int target = sum / 2; // 向下取整// 初始化int[][] dp = new int[stones.length][target + 1];for (int j = stones[0]; j<= target; j++) {dp[0][j] = stones[0];}// 外层 石头for (int i = 1; i < stones.length; i++) {// 内层 背包for (int j = 1; j <= target; j++) {// 下一块石头装不下,最大重量就是上一块石头的if (j < stones[i]){dp[i][j] = dp[i-1][j];}else {dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-stones[i]] + stones[i]);}}}
//        System.out.println("dp[stones.length-1][target] = " + dp[stones.length-1][target]);return sum - dp[stones.length-1][target] - dp[stones.length-1][target];}
}

总结

同样这题分析,看到这种两两成对的放东西,而且一种物品只能放一个一般都是01背包问题,分析清楚问题才好对症下药。

目标和 LeetCode 494

题目链接:目标和 LeetCode 494 - 中等

思路

无。


分成两个集合,一个集合放加法,一个集合放减法:

left + right = sum left - right = target right = sum - left => left = (target + sum) / 2

集合里面挑出正数的集合等于(target + sum) / 2,剩下的就是负数的集合, 不能整除,就证明凑不成集合。

所以这题抽象成 背包容量为(target + sum) / 2,判断集合有多少种装满的情况

  • dp[j]:装满背包容量为j的背包,有dp[j]种方法
  • 递推公式:dp[j] += dp[j-nums[i]]
  • 初始化:dp[0] = 1 (空集也是一种方法) 非零下标初始为0
  • 遍历顺序:物品:0<=i< nums.length 背包 bagSize=j>=nums[i]
class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;for (int num : nums) sum+=num;// 背包(正数)不能是小数或负数if ((target + sum) % 2 == 1 || (target + sum) / 2 < 0) return 0;int bagSize = (target + sum) / 2;// 初始化int[] dp = new int[bagSize+1];dp[0] = 1;// 物品for (int i = 0; i < nums.length; i++) {// 背包for (int j = bagSize; j>= nums[i]; j--){dp[j] += dp[j-nums[i]];
//                System.out.print("dp[j]=" + dp[j] + "\t");}
//            System.out.println();}return dp[bagSize];}
}

二维数组:

  • dp[i] [j]:从[0-i]挑选出的放+数字,恰好装满和为j的背包,有dp[i] [j]种

  • 递归公式:dp[i] [j] = dp[i-1] [j] + dp[i-1] [j-nums[i]]

    • 上一轮挑选出来的的和,本轮未挑选:dp[i-1] [j]
    • 上一轮加本轮挑选:dp[i-1] [j-nums[i]]
  • 初始化:dp[0] [0] = 1 ,dp[i] [0] = 0,

    ​ dp[0] [j] 装nums[0]只有j= nums[0]这一种方法,dp[0] [nums[0]] = 1

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;for (int num : nums) sum+=num;// target的绝对值大于sum,证明背包的数怎么都没法凑成sumif (Math.abs(target) > sum) return 0;if ((target + sum) % 2 == 1) return 0;int bagSize = (target + sum) / 2;// 初始化 - 新开一个物品维度,以防止初始化0的情况int[][] dp = new int[nums.length + 1][bagSize + 1];// 物品维度为0的物品,不一定是0dp[0][0] = 1;// 只放第0个物品,只有背包容量为nums[0]刚好放下if (nums[0] <= bagSize) dp[1][nums[0]] = 1;// 外层 物品for (int i = 1; i < nums.length + 1; i++) {// 内层 背包 // 从0开始遍历是因为我们只初始化了一个点, j=0的情况没有初始化for (int j = 0; j <= bagSize; j++) {if (j < nums[i-1]){// 不会放入背包dp[i][j] = dp[i-1][j];}else {// 可以放入背包 = i-1物品放入背包的数量 +// i-1物品放入背包的数量+再放入nums[i]的物品的最大数量dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i-1]];}
//                System.out.print("\tdp[i][j] = " + dp[i][j]);}
//            System.out.println();}return dp[nums.length][bagSize];}
}

总结

背包容量和价值用一个数表示的话,使用一维数组更加方便,只是我们在遍历的时候从后往前遍历行了,以免前面的数据被覆盖。

一和零 LeetCode 474

题目链接:一和零 LeetCode 474 - 中等

思路

无。


  • dp[i] [j]:装满i个0j个1,最多背dp[i] [j] 个物品
  • 递推公式:dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
    • m个0,n个1:dp[i] [j] = max(dp[i] [j], dp[i-x] [j-y] + 1)
    • 加1是物品的价值可看作1,因为每次可以多放一个
  • 初始化:dp[0] [0] = 0 ,非0下标也该初始化为0
  • 遍历顺序:str=> 统计每个物品有多少个0 1 => 物品重量
    • i=m i>=x 背包容量,这两个顺序可以颠倒
    • j=n j>=y
class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp = new int[m + 1][n + 1];// x表示0的个数,y表示1的个数int x, y;// 遍历每一个物品for (String str : strs) {x = 0;y = 0;// 统计x和y的重量,也就是出现的个数for (char c : str.toCharArray()){if (c == '0') x++;else y++;}// 相当于滚动二维倒叙遍历for (int i = m; i >= x; i--){   // 0的个数for (int j = n; j >= y; j--){   // 1的个数dp[i][j] = Math.max(dp[i][j], dp[i-x][j-y] + 1);}}}return dp[m][n];}
}

总结

本题元素就是物品,每个物品只有一个,所以dp[i-x] [j-y] + 1 这里才是 + 1,就是选了一个物品。

相关文章:

【代码训练营】day42 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

所用代码 java 最后一块石头的重量II LeetCode 1049 题目链接&#xff1a;最后一块石头的重量II LeetCode 1049 - 中等 思路 无。 把石头分成重量总和近似两堆&#xff0c;然后两堆石头相撞&#xff0c;剩下的就是最小的石头。每个石头只能用一次&#xff0c;01背包&#xf…...

Golang协程常见面试题

协程面试题交替打印奇数和偶数N个协程打印1到maxVal交替打印字符和数字交替打印字符串三个协程打印ABCChannel练习交替打印奇数和偶数 下面让我们一起来看看golang当中常见的算法面试题 使用两个goroutine交替打印1-100之间的奇数和偶数, 输出时按照从小到大输出. 方法一&…...

种群多样性:智能优化算法求解基准测试函数F1-F23种群动态变化图(视频)

智能优化算法求解基准测试函数F1种群动态变化图智能优化算法求解基准测试函数F2种群动态变化图智能优化算法求解基准测试函数F3种群动态变化图智能优化算法求解基准测试函数F4种群动态变化图智能优化算法求解基准测试函数F5种群动态变化图智能优化算法求解基准测试函数F6种群动…...

Qt 中的XML

XML的基本介绍&#xff1a; 在前端开发中&#xff1a;HTML是用来显示数据&#xff0c;而XML是用来传输和存储数据的 XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;XML 是一种标记语言&#xff0c;很类似 HTMLXML 的设计宗旨是传输数据&#xff0c;而…...

网络应用之URL

URL学习目标能够知道URL的组成部分1. URL的概念URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符&#xff0c;通俗理解就是网络资源地址&#xff0c;也就是我们常说的网址。2. URL的组成URL的样子:https://news.163.com/18/1122/10/E178J2O4000189FH.html…...

【Linux】重定向原理dup2缓冲区

文章目录重定向原理输出重定向关于FILE解释输出重定向原理追加重定向输入重定向dup2缓冲区语言级别的缓冲区内核缓冲区重定向原理 重定向的本质就是修改文件描述符下标对应的struct file*的内容 输出重定向 输出重定向就是把本来应该输出到显示器的数据重定向输出到另一个文…...

ROG配置ubuntu20.04.5双系统要点

win11ubuntu20.04.5 1. BIOS设置 开机长按F2进入bios设置&#xff0c;修改advanced参数&#xff1a; boot -> 关闭fast bootsecurity -> 关闭secure boot设置VMD controller为Disabled&#xff08;其他电脑是修改硬盘的SATA和ACHI模式&#xff09;。但是改了之后windo…...

机械革命旷世G16电脑开机变成绿屏了无法使用怎么办?

机械革命旷世G16电脑开机变成绿屏了无法使用怎么办&#xff1f;最近有用户使用的机械革命旷世G16电脑一开机之后&#xff0c;电脑屏幕就变成了绿色的&#xff0c;无法进行任何的操作。出现这个问题可能是因为电脑中病毒了&#xff0c;或者是系统出现故障。我们可以通过U盘来重新…...

python中关于time模块的讲解---指定格式时间字符串转为时间戳

本文章可以解决任意字符串格式时间转为时间戳 返回json格式 可以在此基础上进行修改 时间格式控制符 说明 %Y 四位数的年份&#xff0c;取值范围为0001~9999,如1900 %m 月份&#xff08;01~12&#xff09;&#xff0c;例如10 %d 月中的一天&#xff08;01~31&#xff09;例…...

MySql存储引擎与索引

MySql引擎 存储引擎是具体操作数据的地方&#xff0c;是一种对数据存储的技术与其配套的功能 不同存储引擎所采用存储的方式的不同&#xff0c;并且索引技巧与锁定水平也不同 根据业务的需求灵活的选择存储引擎即可满足的实际的需要 Innodb Innodb是MySql中的默认安装的引擎…...

typing库

typing 库 引入 在日常代码编写中&#xff0c;由于python语言特性&#xff0c;不用像go等编译性语言一样&#xff0c;在定义函数时就规范参数和放回值的类型。 def demo(a, b):return "ab" 此时 a 和 b 可以传入任意类型参数毫无疑问&#xff0c;这一特性&#…...

linux shell 入门学习笔记10内置shell命令

bash基础的内置命令 echoevalexecexportreadshift echo命令 -n 不换行输出 -e 解析字符串中的特殊符号\n 换行 \r 回车 \t 制表符 四个空格 \b 退格-n参数演示 xiao123xiao123:~/Downloads$ echo 你真胖;echo 你还挺可爱; 你真胖 你还挺可爱 xiao123xiao123:~/Downloads$ ec…...

[动手写操作系统]-02-开机运行系统并打印‘hello‘

文章目录 理解三个概念: 中断interrupts, CPU,寄存器registers 目标:让上一个静默的界面打印一些文本 我们将改进我们的无限循环引导扇区并在屏幕上打印一些东西。我们将为此提出中断。 我们尝试将"Hello"写到寄存器al, 字节0x0e写到ah (the higher part of ax),并…...

Delete `␍`eslint(prettier/prettier) in vscode 的解决方案

错误描述从 Github 仓库拉取代码&#xff0c;使用 vscode 打开&#xff0c;页面报错&#xff0c;每一行都爆红 &#xff08;如下图&#xff09;问题原因由于历史原因&#xff0c;windows下和linux下的文本文件的换行符不一致。Windows在换行的时候&#xff0c;使用了换行符CRLF…...

gof23 设计模式 各个模式代码demo

Gof23 设计模式&#xff0c;也叫Gang of Four&#xff08;GoF&#xff09;设计模式&#xff0c;是由四位设计模式大师&#xff08;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff09;撰写的一本书——《设计模式&#xff1a;可复用面向对象软件的基础》所…...

0 初识Kotlin

0 基本介绍 相信很多开发者对Kotlin还是比较陌生的。 Kotlin是一种新型的编程语言&#xff0c;由JetBrains公司开发与设计&#xff0c;在2012年开源&#xff0c; 但没引起什么注意。 直到2017年google宣布将Kotlin作为Android开发的首选语言&#xff0c;Kotlin才开始大放异彩。…...

阿里云服务器部署SpringBoot+Vue项目(宝塔面板傻瓜式操作)

准备工作 一台服务器(我用的是阿里云)SpringBoot项目的jar包Vue项目的dist包 一、购买服务器 然后重置实例密码。 远程连接 登陆成功后安装宝塔面板 二、安装宝塔面板(无账号的注册一个账号) 地址&#xff1a;https://www.bt.cn/new/download.html 选择对应的镜像、不知道…...

27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)

目录[27. 移除元素-力扣](https://leetcode.cn/problems/remove-element/description/?languageTagsc)[26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)[88. 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-…...

什么时候用std::move()?

文章目录1. "是什么?"2. "有何用?"3. "什么时候用?"1. “是什么?” 虽然 std::move() 从技术角度上是一个函数 &#xff0c;但我认为它不是真正的函数。 它是编译器考虑表达式值的方式之间的转换器。 2. “有何用?” 首先要注意的是 std…...

建立做机器学习项目的范式

建立起做机器学习项目的范式&#xff0c;萃取出核心步骤&#xff0c;避免后面做项目没有明确的方向。 核心步骤&#xff1a; 1、明确自己想做什么样的项目&#xff0c;感兴趣的领域&#xff1b; 2、找到满足项目的数据集&#xff0c;开源的或者自建数据集&#xff1b; 数据…...

如何用嘎嘎降AI处理法学论文:法学毕业论文降AI4.8元完整操作教程

如何用嘎嘎降AI处理法学论文&#xff1a;法学毕业论文降AI4.8元完整操作教程 关于法学论文降AI教程&#xff0c;有几个细节提前知道能少走很多弯路。 核心用嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.8元&#xff0c;达标率99.26%。这篇把容易忽略的…...

跨越生态鸿沟:Windows如何优雅解码苹果的HEIC格式

跨越生态鸿沟&#xff1a;Windows如何优雅解码苹果的HEIC格式 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你知道吗&#xff…...

Python 实现电脑垃圾自动清理工具(附完整源码)

最近很多朋友都在问&#xff1a;为什么电脑明明配置不差&#xff0c; 但用久了还是越来越卡&#xff1f;其实很多时候&#xff0c;并不是硬件问题。而是&#xff1a;临时文件过多缓存堆积回收站没清理系统垃圾越来越多于是我用 Python 写了一个&#xff1a;“电脑垃圾自动清理工…...

DH1766电源短路测试避坑指南:为什么你的保险丝熔断时间和想象的不一样?

DH1766电源短路测试中的保险丝熔断现象深度解析 在电子工程实验室中&#xff0c;可编程电源的短路测试是验证电路保护器件性能的常规操作。然而&#xff0c;当使用DH1766这类高精度电源进行测试时&#xff0c;许多工程师都会遇到一个令人困惑的现象&#xff1a;保险丝的实际熔断…...

千川素材外包月烧3万,转易元AI自产省70%成本,跑量还更猛——真实账单对比

很多商家做千川投放时&#xff0c;最开始以为最贵的是投流预算&#xff0c;后来才发现&#xff0c;真正长期烧钱的其实是素材。计划每天要新视频&#xff0c;爆款跑起来要裂变&#xff0c;素材疲劳了要补货&#xff0c;全域推广还要不同场景、不同卖点、不同人群的素材矩阵。外…...

公域卖课佣金高、粉丝留不住?这套私域打法,完课率提升了3倍

公域卖课的两大痛点痛点一&#xff1a;佣金太高&#xff0c;利润被吃掉一大块。相信在公域卖过课的朋友都有体会。平台抽成、分销佣金、投流成本……七七八八算下来&#xff0c;到手的钱可能连一半都不到。你辛辛苦苦打磨的课程&#xff0c;大头却被别人拿走了。这感觉&#xf…...

告别FreeRTOS:在乐鑫ESP32-C3上为RT-Thread打上‘内核补丁’的完整指南

从FreeRTOS到RT-Thread&#xff1a;ESP32-C3内核替换的工程实践 在嵌入式开发领域&#xff0c;操作系统的选择往往决定了项目的技术栈和生态边界。对于习惯了ESP-IDF和FreeRTOS的开发者来说&#xff0c;RT-Thread以其模块化设计和丰富的中间件支持正成为颇具吸引力的替代方案。…...

UE5运行时动态调整游戏视口:解决UI遮挡导致物体位置偏移的实战方案

UE5运行时动态调整游戏视口&#xff1a;解决UI遮挡导致物体位置偏移的实战方案 当你在UE5项目中设计了一个精美的HUD界面&#xff0c;却发现那些半透明的UI元素正在悄悄改变游戏世界的坐标规则——原本应该出现在屏幕中心的角色突然偏离了位置。这不是视觉错觉&#xff0c;而是…...

告别拓展坞!实测Spacedesk无线投屏:Win10/Win11到iPad的延迟、画质与触控体验全解析

Spacedesk无线投屏实战评测&#xff1a;Win11与iPad Pro的协作新范式 当iPad Pro的Liquid视网膜显示屏遇上Windows系统的生产力工具&#xff0c;能否摆脱线材束缚实现无缝协作&#xff1f;Spacedesk这款免费无线投屏软件正在重新定义多屏工作场景。作为深度体验过各类投屏方案的…...

基于 Transformer 架构的翻译模型实践 - 主流分词器(Tokenizer)的对比

基于 Transformer 架构的翻译模型实践 - 主流分词器&#xff08;Tokenizer&#xff09;的对比 flyfish 参考 https://github.com/shaoshengsong/ pytorch -transformer-en-zh-translation-demo对hello不同的分词方案可以分为单个字符【h&#xff0c;e&#xff0c;l&#xff0c;…...