代码随想录算法训练营第四十八天(动态规划篇之01背包)| 1049. 最后一块石头的重量Ⅱ,494. 目标和

news2024/10/6 22:28:37

1049. 最后一块石头的重量Ⅱ

题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)

思路

尽量将石头分为重量相同的两堆,这样两堆中的石头相撞之后剩下的石头就会最小。根据之前的01背包理论:

代码随想录算法训练营第四十五天(动态规划篇)|01背包-CSDN博客

代码随想录算法训练营第四十六天(动态规划篇)|01背包(滚动数组方法)-CSDN博客

可以设背包容量为石头重量总和的一半,求它所能装的最大价值,之后就能得到最后所剩的石头。

代码实现

class Solution(object):
    def lastStoneWeightII(self, stones):
        G1 = sum(stones)//2   
        G2 = sum(stones) - G1 
        dp = [0] * (G1 + 1)
        for num in stones:
            for j in range(G1, num - 1, -1):
                dp[j] = max(dp[j], dp[j - num] + num)
        return (G1 - dp[G1] + G2) - dp[G1]
        
       # e.g.  分为33,34两堆,如果容量为33的背包所装的最大价值为31,那相撞后的那块石头质量为(33 - 31 + 34) - 31
        

494. 目标和

题目链接:494. 目标和 - 力扣(LeetCode)

思路

把数组里的数分为两部分:前面符号为“+”,即要被加的数,和前面符号为“-”,即要被减的数。设所有参与加法的数和为x,参与减法的数和为y,则x-y = target,x+y=sum,联立得x = (target+sum)/2。因此题目就变成了寻找数组中和为(target+sum)/2的子集总和,转变为01背包问题,即能将容量为(target+sum)/2背包装满的方法。

1. dp数组定义

dp[j]: 将容量为j的背包装满的方法。

2. 递推公式

遍历数组中的数,每遍历到新的数nums[i],相当于新加了一个物体,那么dp[j](能装满容量为j的包的方法)就会发生变化,之前的方法加上当前物体所能贡献的那部分,当前物体可以帮着填充容量为j-nums[i]的包。因此,dp[j]因为nums[i]的到来,多了dp[j-nums[i]]种新方法。

所以递推公式为dp[j] += dp[j-nums[i]]

3. 初始条件

当背包容量为0,有1种方法,即什么都不选,dp[0] = 1

4. 递推顺序

使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历。

5. 举例推导dp数组

输入:nums:[1, 1, 1, 1, 1], S:3

bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4

dp数组状态变化如下:

对于第一个数字1,只能填满容量为0和容量为1的背包,当考虑到第二个1时,可能填满的背包容量为1到S = 3。如果要填满容量为3的背包,就要看看已有的物体有多少种填满容量为2的包的方法,但没有(dp[2] = 0),所以dp[3]只能保持为0。但新加入的物体1可以帮着填满容量为2的包,因为之前已经有一种方法可以装满容量为1的包了,因此dp[2] = 1。

代码实现

class Solution(object):
    def findTargetSumWays(self, nums, target):
        if abs(target) > sum(nums):   # 对于nums,最大能得到的数是全体非负整数相加,最小是最大值的负数,如果target超过次范围,则没有方法。
            return 0
        if (target + sum(nums))%2 == 1:
            return 0
        x = (sum(nums) + target)/2
        dp = [0] * (x + 1)
        dp[0] = 1
        for num in nums:
            for j in range(x, num - 1, -1):
                dp[j] += dp[j - num]
        return dp[x]

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

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

相关文章

Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

C++面向对象 Part 2

文章目录 类六个默认存在的成员函数构造函数:析构函数:拷贝构造函数:拷贝构造详解及细节: 赋值运算符重载;取地址及const取地址操作符重载const修饰的含义: 类六个默认存在的成员函数 构造函数 析构函数 拷贝构造函数 赋值运算…

Vulnhub靶机:hacksudo-search

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:hacksudo-search(10.0.2.50) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.co…

Android:Cordova,JavaScript操作设备功能

Cordova学习 Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。 Cordova还提供了一组统一的JavaScript类库,以及为这些类库所用的设备相关的原生后台代码。 Cordova是PhoneGap贡献给Apache后的开源项目,是从…

吉他学习:C大调第一把位音阶,四四拍曲目练习 小星星,练习的目的

第十三课 C大调第一把位音阶https://m.lizhiweike.com/lecture2/29364198 第十四课 四四拍曲目练习 小星星https://m.lizhiweike.com/lecture2/29364131 C大调第一把位音阶非常重要,可以多练习&#x

[ai笔记2] 团年饭ai制图大比拼

欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第2篇分享! 今天我们用国内七个大厂的ai制图工具做一下团年饭图片! 1 团年饭ai制图大比拼 昨天期待了许久的ai春晚,并没有如期举行,换成了初一晚上&…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

app逆向-⽹络请求库okhttp3

文章目录 一、前言二、应用1、添加权限AndroidManifest.xml2、添加依赖okhttp33、编写界面文件activity_main.xml4、编写Activity代码 三、效果 一、前言 OkHttp是由Square公司开发的用于Java和Android的开源HTTP客户端库。它被广泛用于在Java和Android应用程序中进行HTTP请求…

【蓝桥杯冲冲冲】k 短路 / [SDOI2010] 魔法猪学院

蓝桥杯备赛 | 洛谷做题打卡day33 文章目录 蓝桥杯备赛 | 洛谷做题打卡day33题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模数据更新日志 题解代码我的一些话 【模板】k 短路 / [SDOI2010] 魔法猪学院 题目背景 注:对于 k k k 短路问…

假期刷题打卡--Day29

1、MT1224棋盘 求一个N*N棋盘中的方块总数。 格式 输入格式: 输入整型N 输出格式: 输出整型 样例 1 输入: 2输出: 5备注 考虑到取值范围,可用long整型定义变量 分析过程 这个题目的意思是,在这…

java 执行方式和类加载过程

java默认属于混合执行: 编译和解释并存 java先进行解释执行,遇到多次重复的代码会把它编程成可执行文件,方便下次直接执行。 可以通过VM参数来修改执行方式。 类加载过程

卫星为什么要挂在天上,而不放在地上?

经常有客户问我,30W调频广播发射机可覆盖多大半径、100W发射机可以覆盖多大半径,今天就无线电发射机的覆盖半径,给大家做一个科普性的讲解。 无线电信号的传输和多个因素都有关系,发射机有效功率、天线增益、天线高度、馈线损耗、…

大数据Flume--入门

文章目录 FlumeFlume 定义Flume 基础架构AgentSourceSinkChannelEvent Flume 安装部署安装地址安装部署 Flume 入门案例监控端口数据官方案例实时监控单个追加文件实时监控目录下多个新文件实时监控目录下的多个追加文件 Flume Flume 定义 Flume 是 Cloudera 提供的一个高可用…

【实习】深信服防火墙网络安全生产实习

一、实习概况 1.1实习目的 1.掌握防火墙规则的作用2.掌握代理上网功能的作用3.掌握端口映射功能的作用 1.2实习任务 1.防火墙的WEB控制台 2.需要在防火墙上配置dnat …

计算机网络——06分组延时、丢失和吞吐量

分组延时、丢失和吞吐量 分组丢失和延时是怎样发生的 在路由器缓冲区的分组队列 分组到达链路的速率超过了链路输出的能力分组等待排到队头、被传输 延时原因: 当当前链路有别的分组进行传输,分组没有到达队首,就会进行排队,从…

结构体数组所有元素(1亿个元素)初始化为相同的值

一个结构体数组,有1亿个元素,每个元素都要初始化为相同的值,如果没有现成的语法直接支持这样的初始化操作,就得用for循环写,会不会非常耗时? 如果结构体里的成员都是一些简单的基本数据类型,整…

【Opencv学习】04-图像加法

文章目录 前言一、图像加法混合1.1 代码1.2 运行结果 二、图像的按位运算-组合相加2.1 代码2.2 运行结果示例:PPT平滑切换运行结果 总结 前言 简单说就是介绍了两张图如何组合在一起。 1、混合,透明度和颜色会发生改变 2、组合,叠加起来。可…

一周学会Django5 Python Web开发-Django5创建项目(用PyCharm工具)

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…

fast.ai 深度学习笔记(四)

深度学习 2:第 2 部分第 8 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-8-5ae195c49493 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,这…

【Rust】——猜数游戏

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…