代码随想录算法训练营第45天| 139.单词拆分 多重背包

JAVA代码编写

139.单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s

**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
     注意,你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

教程:https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html

方法一:动态规划

思路:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

还是有点反应不过来。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

步骤

  1. 定义dp [i]: 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。

  2. 递推公式:

    如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。

    所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

  3. dp数组初始化:dp[0] =true,其他初值都是false

  4. 确定遍历顺序:

    如果求组合数就是外层for循环遍历物品,内层for遍历背包

    如果求排列数就是外层for遍历背包,内层for循环遍历物品

    强调物品之间顺序。

    所以说,本题一定是 先遍历背包,再遍历物品。

  5. 举例推导dp数组,

    以输入: s = “leetcode”, wordDict = [“leet”, “code”]为例,dp状态如图:

139.单词拆分

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( m a x ( m , n ) ) O(max(m, n)) O(max(m,n))
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        HashSet<String> set = new HashSet<>(wordDict);
        boolean[] valid = new boolean[s.length() + 1];
        valid[0] = true;

        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j < i && !valid[i]; j++) {
                if (set.contains(s.substring(j, i)) && valid[j]) {
                    valid[i] = true;
                }
            }
        }

        return valid[s.length()];
    }
}

56. 携带矿石资源(多重背包)

题目描述

你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球,但你的宇航舱有一定的容量限制。

给定一个宇航舱,最大容量为 C。现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。不同类型的矿石在地球上的市场价值不同。你需要计算如何在不超过宇航舱容量的情况下,最大化你所能获取的总价值。

输入描述

输入共包括四行,第一行包含两个整数 C 和 N,分别表示宇航舱的容量和矿石的种类数量。

接下来的三行,每行包含 N 个正整数。具体如下:

第二行包含 N 个整数,表示 N 种矿石的重量。

第三行包含 N 个整数,表示 N 种矿石的价格。

第四行包含 N 个整数,表示 N 种矿石的可用数量上限。

输出描述

输出一个整数,代表获取的最大价值。

输入示例
10 3
1 3 4
15 20 30
2 3 2
输出示例
90
提示信息
数据范围:
1 <= C <= 10000;
1 <= N <= 10000;
1 <= w[i], v[i], k[i] <= 10000;

教程:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%A4%9A%E9%87%8D%E8%83%8C%E5%8C%85.html#%E5%A4%9A%E9%87%8D%E8%83%8C%E5%8C%85

方法一:动态规划

思路多重背包

有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。

背包最大重量为10。

物品为:

重量价值数量
物品01152
物品13203
物品24302

每件物品是有限个!

01背包和多重背包唯一不同就是物品的个数上,我们直接针对遍历顺序经行分析!

需要多加一个循环限制物品的数量

for (int i = 0; i < n; i++) { // 遍历物品
    for (int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
        // 以上为01背包,然后加一个遍历个数
        for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数
            dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]);
        }
    }
}

dp状态图如下:

在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n ∗ b a g W e i g h t 2 ) O(n * bagWeight^2) O(nbagWeight2),其中n是物品的数量,bagWeight是背包的容量。
  • 空间复杂度:O(bagWeight),其中bagWeight是背包的容量。
class Solution {
    public static void main(String[] args) {
        int bagWeight =10;
        int[] weight = new int[] {1,3,4};
        int[] value = new int[] {15,20,30};
        int[] nums = new int[] {2,3,2};
        int n = weight.length;

        int[] dp = new int[bagWeight + 1];

        for (int i = 0; i < n; i++) { // 遍历物品
            for (int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
                // 以上为01背包,然后加一个遍历个数
                for (int k = 1; k <= nums[i] && (j - k * weight[i]) >= 0; k++) { // 遍历个数
                    dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]);
                }
            }
        }
        System.out.println(dp[bagWeight]);
    }
}

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

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

相关文章

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈&#xff0c;制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备&#xff0c;实现生产线的智能化和自适应生产&#xff0c;优化生产流程&#xff0c;提高生产效率和质量&#xff0c;为企业创造更大的价值。 方案概述 智…

Linux 压缩、文件传输与安装

目录 1. 压缩 1.1 tar 1.2 gzip 1.3 zip 1.4 rar 2 文件传输 2.1 网站下载 2.2 scp 传输 2.3 rz 和 sz 2.4 xftp 3.安装 3.1 编译安装 &#xff08;ngnix&#xff09; 3.2 rpm 安装 3.3 yum 安装 1. 压缩 1.1 tar 使用 tar 压缩文件时&#xff0c;会保留源文件…

使用MetaMask + Ganache搭建本地私有网络并实现合约部署与互动

我使用Remix编写合约&#xff0c;MetaMask钱包工具和Ganache搭建了一个私有网络&#xff0c;并且实现了合约的部署和互动。 在前面的博客中提到了 Remix在线环境及钱包申请 以及 Solidity的基本语法 &#xff0c;没看过的小伙伴可以点击链接查看一下&#xff0c;都是在本专栏下…

智能时代:互联网+如何改变我们的生活与工作

引言 随着科技的不断进步和互联网的普及&#xff0c;我们正处在一个智能时代。这个时代被互联网所定义&#xff0c;它深刻地改变了我们的生活和工作方式。从社交互动到日常工作&#xff0c;智能时代的影响无处不在&#xff0c;给人们带来了前所未有的变革和机遇。 互联网的涌…

模电·放大电路的分析方法——图解法

放大电路的分析方法——图解法 静态工作点的分析电压放大倍数的分析波形非线性失真的分析直流负载线与交流负载线图解法的适用范围 在实际测出放大管的输入特性、输出特性和已知放大电路中其它各元件参数的情况下&#xff0c;利用作图的方法对放大电路进行分析即为图解法。 静…

FacetWP WordPress网站高级筛选过滤插件(含所有扩展)

点击阅读FacetWP WordPress网站高级筛选过滤插件原文 FacetWP WordPress网站高级筛选过滤插件向电子商务网站、资源库、搜索页面等添加分面搜索。FacetWP 的过滤元素&#xff08;称为 facets&#xff09;动态调整以适应用户输入。这有助于防止出现“未找到结果”&#xff0c;从…

OpenSSL 编程指南

目录 前言初始化SSL库创建SSL 上下文接口(SSL_CTX)安装证书和私钥加载证书(客户端/服务端证书)加载私钥/公钥加载CA证书设置对端证书验证例1 SSL服务端安装证书例2 客户端安装证书创建和安装SSL结构建立TCP/IP连接客户端创建socket服务端创建连接创建SSL结构中的BIOSSL握手服务…

【MATLAB源码-第99期】基于matlab的OFDM系统卡尔曼滤波(kalman)信道估计,对比LS,MMSE。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 卡尔曼滤波器&#xff08;Kalman Filter&#xff09;是一种有效的递归滤波器&#xff0c;它能够从一系列的含有噪声的测量中估计动态系统的状态。在无线通信领域&#xff0c;尤其是在正交频分复用&#xff08;OFDM&#xff0…

Pandas中的Series(第1讲)

Pandas中的Series(第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

Redis基础入门

第1章&#xff1a;引言 大家好&#xff01;我是小黑&#xff0c;今天咱们来聊聊Redis。Redis&#xff0c;这个名字你可能在不少地方听过&#xff0c;尤其是在后端开发领域&#xff0c;它可是个大名鼎鼎的角色。&#xff0c;Redis是一个开源的内存中数据结构存储系统&#xff0…

利用jdbc对数据库进行增删改查

步骤/过程&#xff1a; 1&#xff0c;导入驱动包 2&#xff0c;加载驱动包 3&#xff0c;输入信息&#xff0c;进行数据库连接 4&#xff0c;创建 statement对象 5&#xff0c;执行sql语句 6&#xff0c;如果是查询操作&#xff0c;利用ResultSet处理数据&#xf…

Plantuml之类图语法介绍(十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Ubuntu中编译出Windows的可执行程序(.exe)

1、前言 在嵌入式开发中&#xff0c;交叉编译是很常见的情况&#xff0c;如果你把Windows电脑也看做一块高性能的开发板&#xff0c;那在Ubuntu中编译出Windows上运行的可执行程序也是很好理解的行为。 2、安装mingw64环境 sudo apt-get install mingw-w64 3、测试编译链是否安…

淘宝权益玩法平台的Serverless化实践

通过对权益玩法平台现有业务应用的Serverless化改造&#xff0c;权益团队在双十一期间完美地支撑了业务需求&#xff0c;在研发效率、运维保障等方面都体现出了很高的价值和收益。 项目背景 淘宝权益平台是负责淘宝权益营销的核心团队&#xff0c;团队除了负责拉菲权益平台外&a…

反汇编语言区分函数和运算符

在汇编语言中&#xff0c;函数和运算符可以通过一些特定的指令和约定来区分。 函数&#xff1a; 函数通常由一系列指令组成&#xff0c;用于执行特定的任务或操作。函数通常具有入口点和出口点&#xff0c;分别表示函数的开始和结束位置。函数通常包含参数传递、局部变量的分配…

VIM光标移动和翻页快捷键-包含vim帮助文档截图

光标移动到行首(行首没有空格)&#xff1a; ^ 光标移动到行首(行首有空格)&#xff1a; 数字0 光标移动到行尾&#xff1a; $ 移动到指定行&#xff1a;7G(数字加一个大G&#xff09; 光标移动到文件开始&#xff1a;gg(两个小g) 光标移动到文件末尾&#xff1a;G(一个大G&…

根据对数器找规律、根据数据量猜题目解法

题目一 小虎去买苹果&#xff0c;商店只提供两种类型的塑料袋&#xff0c;每种类型都有任意数量。1&#xff09;能装下6个苹果的袋子2&#xff09;能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果&#xff0c;但是小虎有强迫症&#xff0c;他要求自己使用的袋子数量必须…

Weblogic T3协议反序列化漏洞

文章目录 1. Weblogic T3协议反序列化漏洞1.1 漏洞描述1.2 基本原理1.3 漏洞复现1.4 修复建议 1. Weblogic T3协议反序列化漏洞 1.1 漏洞描述 说明内容漏洞编号CVE-2018-2628漏洞名称Weblogic T3协议反序列化漏洞漏洞评级高危影响范围Weblogic 10.3.6.0Weblogic 12.1.3.0Webl…

2024年甘肃省职业院校技能大赛信息安全管理与评估赛项一阶段样题一

2024年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项样题一 竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防…

二叉树查找值为x的结点(C语言)

目录 前言 查找值为x的结点 返回值为指针 返回值为布尔类型 整体代码 前言 在二叉树结点个数、叶子结点个数、树的高度、第k层结点个数的计算&#xff08;C语言&#xff09;中&#xff0c;我们解决了关于二叉树的部分问题&#xff0c;但是还有一个问题我们放在本篇解决。 …