代码随想录算法训练营day43 | 1049. 最后一块石头的重量 II ,494. 目标和,474.一和零,01背包问题总结

news2025/1/11 8:53:20

代码随想录算法训练营day43 | 1049. 最后一块石头的重量 II ,494. 目标和,474.一和零

  • 1049. 最后一块石头的重量 II
    • 解法一:动态规划
  • 494. 目标和
    • 解法一:动态规划
  • 474.一和零
    • 解法一:动态规划
  • 01背包问题总结


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

教程视频:https://www.bilibili.com/video/BV14M411C7oV
在这里插入图片描述

思路:尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就将本题化解成01背包问题了。
此时背包容量是sum/2,物品重量和价值都等于数组中的每个数字。

解法一:动态规划

1、dp[j]含义:将数值放入容量为j的背包中能得到的最大重量。
2、递推公式:dp[j]=Math.max(dp[j], dp[j-stones[i]]+stones[i]);
3、dp初始化:dp[0]=0;重量都大于等于1,为正整数,递推过程中小的值会被覆盖,因此其他索引的值初始化成0就可以
4、遍历顺序:外层for控制放入被报道石头,内层for反向遍历背包容量
5、打印验证

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int sum = 0;
        for(int i=0;i<stones.length;i++){
            sum +=stones[i];
        }
        //创建dp数组
        int bagSize = sum/2;
        int[] dp = new int[bagSize+1];
        //java默认初始化为0,不需要显示初始化

        for(int i=0;i<stones.length;i++){
            for(int j=bagSize;j>=stones[i];j--){
                //两种情况,要么放,要么不放
                dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return sum-2*dp[bagSize];
    }
}

494. 目标和

教程视频:https://www.bilibili.com/video/BV1o8411j73x
在这里插入图片描述
在这里插入图片描述
思路:将所有数值划分为加的数(positive)和减的数(negative),sum=positive+negative,根据题意需要满足positive-negative=target。可以转换成:positive-(sum-positive)=target,由于sum和target已知,positive=(sum+target)/2,这就是背包容量。如果positive不为整数,说明nums不能凑成target(可以剪枝)。

解法一:动态规划

1、dp[j]定义:和为j的表达式数目。
2、递推公式:dp[j]+=dp[j-nums[i]];(只要搞到nums[i],就有dp[j - nums[i]] 种方法可以凑成dp[j]。
3、dp初始化:因为递推公式是累加,dp[0]不能为0,可以想成和为0就只有所有值都不放入背包这一种方式,dp[0]=1;其他都是加法累计过来的,初始化为0。
4、遍历顺序:外层for遍历nums,内层for倒序遍历背包容量。
5、打印验证。

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        //如果target绝对值大于sum,将无法满足,返回0
        if( target > sum)return 0;
        if ( target < 0 && sum < -target) return 0;

        //如果sum+target/2为小数,将不能得到target,返回0
        if((sum+target)%2 == 1)return 0;
        int bagSize = (sum+target)/2;//经过上面的判断,bagSize一定大于等于0
        
        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]];
            }
        }
        return dp[bagSize];
    }
}

474.一和零

教程视频:https://www.bilibili.com/video/BV1rW4y1x7ZQ
在这里插入图片描述
思路:本题类似1049. 最后一块石头的重量 II,但是本题的背包容量有两个维度(可以理解为从重量和体积两个维度限制了放入为物品),因此背包需要使用两层for循环来反向遍历。

解法一:动态规划

1、dp[j][k]含义:背包容量为 j 个0和 k个1时,最大子集长度。
2、递推公式:dp[j][k]=Math.max(dp[j][k], dp[j-a][k-b]+1);其中 a为strs中0的个数,b为strs中1的个数。
3、dp初始化:dp[0][0]=0;,对于其他非0下标,都会被max迭代,所以取最小值0即可。
4、遍历顺序:外层for循环遍历strs,内层两个for循环倒序遍历背包容量。
5、打印验证

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        //创建dp数组,dp[j][k]表示j个0和k个1时的最大子集
        int[][] dp = new int[m+1][n+1];
        //初始化dp数组,默认为0,无需显示初始化

        for(int i=0;i<strs.length;i++){
            //统计strs[i]中0和1的个数
            int a=0,b=0;
            for(int index=0;index<strs[i].length();index++){
                if(strs[i].charAt(index)=='0'){
                    a++;
                }else{
                    b++;
                }
            }
            // System.out.println(strs[i]+"中,0的个数="+a+", 1的个数="+b);
            for(int j=m;j>=a;j--){
                for(int k=n;k>=b;k--){
                    dp[j][k]=Math.max(dp[j][k], dp[j-a][k-b]+1);
                }
            }
        }
        return dp[m][n];
    }
}

01背包问题总结

此时我们讲解了0-1背包的多种应用,

  • 纯 0 - 1 背包 是求 给定背包容量 装满背包 的最大价值是多少。dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);输出dp[dp.length-1];
  • 416.分割等和子集是求 给定背包容量,能不能装满这个背包。dp[j]=Math.max(dp[j], dp[j-nums[i]]+nums[i]);输出dp[sum/2] == sum/2;
  • 1049.最后一块石头的重量 II是求 给定背包容量,尽可能装,最多能装多少。dp[j]=Math.max(dp[j], dp[j-stones[i]]+stones[i]);输出sum-2*dp[bagSize];
  • 494.目标和 是求 给定背包容量,装满背包有多少种方法。dp[j]+=dp[j-nums[i]];输出dp[bagSize];
  • 474.一和零 是求 给定背包容量,装满背包最多有多少个物品。dp[j][k]=Math.max(dp[j][k], dp[j-a][k-b]+1);输出dp[m][n];

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

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

相关文章

商场导航地图系统,商场导航怎么实现?

商场导航怎么实现&#xff1f;在商场里面&#xff0c;手机上的导航往往接收不了信号或者不支持&#xff0c;由于室内不只是平面的&#xff0c;跟室外导航有很大的区别&#xff0c;因此&#xff0c;室内如何快速导航就成了现代化发展的趋势。电子地图作为大家最喜闻乐见的高效应…

交换机欺骗(Switch Spoofing)简介

交换机欺骗是修改设备的 MAC 地址以伪装成授权交换机端口并获得对目标网络的访问权限的过程。由于 MAC 地址对于特定设备是唯一的&#xff0c;因此大多数网络使用这些 MAC 地址来验证设备并与其通信或建立网络连接。通过欺骗授权设备或更简单地说&#xff0c;网络识别为“受信任…

redis_exporter 部署

目录 - 下载地址- 启动vim ./start.shvim ./stop.sh - 配置prometheus - 下载地址 https://github.com/oliver006/redis_exporter/releases - 启动 为了方便辨认 我更改了它的端口&#xff0c;并编了./start.sh和./stop.sh两个脚本方便以后启动&#xff0c;语句如下&#xf…

机器学习之逻辑回归、一(学习理论)

P(D|θ&#xff09; 文章目录 一、前言二、逻辑回归的由来三、到底什么是逻辑回归&#xff08;1&#xff09;. 先对逻辑回归有个大概感觉&#xff08;2&#xff09;.逻辑回归与线性回归的区别&#xff08;3&#xff09;.sigmoid函数&#xff08;4&#xff09;目标函数&#xf…

有关于ChatGPT你需要了解的内容应该都在这了,看这一篇就够啦

在国内用了很长一段时间的ChatGPT&#xff0c;每次跟小白&#xff0c;哪怕是用ChatGPT的人交流的时候&#xff0c;都感觉解释不清&#xff0c;正好今天周末&#xff0c;给大家整理一篇关于ChatGPT的科普文&#xff0c;想要了解或使用ChatGPT的人&#xff0c;一定要看完~~~ 什么…

内网渗透(CS与MSF联动) ATTCK实战系列一红队实战(一)

靶场下载地址: http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 拓扑图 环境配置 win7网络配置情况: 外网 内网域网络 Win2K3网络配置情况: 内网域网络 win2008(域控)网络配置情况: 内网域网络 渗透过程 开始之前&#xff0c;先到win7上开启phpstudy 打开网页&#…

安装 kubeadm

安装 kubeadm、kubelet 和 kubectl 基于Red Hat的发行版本 1、写入软件源 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch enabled1 gpgcheck1 …

盘点谷歌26个插件生态;WPS AI上新与测评;Prompt中文指南;ChatGPT最新联网插件评测 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『Google 最新发布的26个插件&#xff0c;哪些ChatGPT也有&#xff1f;』插件生态初见端倪 ▢ Google自家生态 (9个)&#xff1a;办公…

CATIA操作经典技巧问答

如何快速知道当前的CATIA作图区上的零件的放大比例? 答:选中TOOLS----->OPTIONS----->VISUALIZATION----> DISPLAY CURRENT SCALE IN PARALLEL, MODE 的选项. 在屏幕的右下方的数值表示当前作图区内的几何体的显示比例。 如何快速定义草图方向? 答:按CTRL键点选在…

Crypto VC 们最近有何动向?7 个工具助你轻松追踪

http://www.btcwbo.com/7289.html 加密 VC 和基金对初创项目的投资收益超过百万美元。它们为具有增长潜力的早期创业公司提供资金、技术支持和专业知识&#xff0c;作为交换&#xff0c;它们将获得这些公司的股份&#xff08;代币&#xff09;。 你可能经常会听到“VC 投了”之…

nacos注册中心源码分析二之服务发现

nacos服务发现 服务发现是客户端发起负载均衡(feign)调用接口的时候内部第一次调用nacos服务端接口的时候去调用的 后续调用基本上都是从客户端的缓存列表里边去取&#xff0c;拿不到才会向服务端发起调用 如果想看这一块代码可以看下ribbion源码分析ribbon源码分析 上一篇&am…

什么是互联网交换中心?为什么它很重要?

互联网交换中心&#xff08;Internet Exchange Point, IXP&#xff09;是为促进互联网骨干网的网间互联和公平竞争而设置的运营商间进行数据网际交换的机构&#xff0c;是为互联网业者提供空间进行网络互连、交换流量和资源的服务场所&#xff0c;互联网业者可以在这里利用机架…

基于自定义知识库回答问题的ChatGPT-

前言 ChatGPT是一个强大的语言模型&#xff0c;利用大规模的自然语言处理和机器学习算法&#xff0c;可以进行自然而流畅的对话&#xff0c;理解自然语言问题和回答&#xff0c;相信在座各位&#xff0c;尤其是程序员的你&#xff0c;肯定不可能还没使用过ChatGPT。 ChatGPT能…

属于开发者的交流,openGauss SIG版本规划工作会议来啦!

想参与SIG组未来半年的规划与工作&#xff1f; 想与开发者们近距离探讨需求与解决方案&#xff1f; 想将您的需求合入到openGauss的下个版本&#xff1f; 想在社区年度Summit上展现成果&#xff1f; 那就不能错过这个属于开发者的交流盛会&#xff01; 社区年度开发者大会…

取用水监测计量标准化建设,加强流量在线监测

方案背景 根据《关于强化取水口取水监测计量的意见》、《十四五”节水型社会建设规划》以及《2022年水资源管理工作要点》等政策要求&#xff0c;为强化水资源管理&#xff0c;做好水资源税改革&#xff0c;构建节水型社会&#xff0c;要全面加强取水计量监测设施建设&#xff…

计算机网络实验(ensp)-​实验2:PP协议及PAP认证

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.修改路由器名字 1.输入命名&#xff1a;sys 从用户视图切换到系统视图 2.输入命名&#xff1a;sysname 姓名 修改路由器名字 3.重复步骤1和2配置每台路由器 3.抓包 1.点击菜单栏的“数…

计算机图形学-GAMES101-6

一、前情提要 在观察和投影变换的基础上提出了视口变换&#xff0c;最终我们会将【-1,1】^ 3 立方体转换到屏幕空间中去。 当所有图像都在屏幕空间中时&#xff0c;我们就要将所有的图像画在屏幕上&#xff0c;这个过程就是光栅化&#xff0c;光栅化就是简单的在屏幕空间的采样…

独家公布!985/211高校毕业生源数量统计Top10揭晓……

2023&#xff0c;985/211高校硕博毕业生总数约达49W。 这是在各大高校官网、官方公众号统计/整理后得到的数据。可能不完全&#xff0c;但数量已经足够庞大&#xff0c;就业竞争也更为激烈。 为了帮助大家更好地了解这些大学的毕业生源情况&#xff0c;本文将为大家揭晓&#x…

Live800:新消费浪潮涌起,在线客服系统如何“升级”?

时代在发展&#xff0c;舞台下的观众已经逐渐成长。 伴随着时代的快速发展&#xff0c;一方面&#xff0c;消费者的行为习惯和消费决策模式变迁&#xff0c;消费者的心理、兴趣及年龄层发生了巨大变化。另一方面&#xff0c;互联网信息透明化打破行业边界&#xff0c;让消费者…

赛效:如何在线变声改变产品宣传片配音

1&#xff1a;打开网页版腾讯智影并登录账号&#xff0c;点击智能小工具里的“智能变声”。 2&#xff1a;我们页面左侧上传音频。 3&#xff1a;试听变声模板后&#xff0c;选择一个模板&#xff0c;点击右下角“制作变声音频并下载”。 4&#xff1a;变声视频声音生成后&…