代码随想录算法训练营Day43 | 322. 零钱兑换、279. 完全平方数、139.单词拆分、多重背包理论基础

news/2024/10/28 3:51:57/

目录

322. 零钱兑换

279. 完全平方数

139.单词拆分

多重背包理论基础

322. 零钱兑换

题解

322. 零钱兑换 - 力扣(LeetCode)

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

思路

代码随想录:322.零钱兑换

视频讲解:LeetCode:322.零钱兑换

转换为完全背包理论:

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j]为凑足总金额 j 所需的最少硬币个数。
  2. 确定递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j])
  3. 数组初始化:凑够金额 0 的硬币个数为 0,所以dp[0] = 0,由于递推公式中获取的是 min,所以非 0 下标应该初始化为一个比较大的数,如 Integer.MAX_VALUEamount + 1,由于题目提示中告知 amount <= 10000,所以也可以初始化为10001。
  4. 确定遍历顺序:本题求的是硬币最小个数,可以选择外层遍历物品内层遍历背包(反过来也可以),由于是完全背包类型,所以选择顺序遍历。
  5. 举例推导:

322.零钱兑换

题解

java">	class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];for (int i = 0; i < dp.length; i++) {dp[i] = 10001;}dp[0] = 0;for (int i = 0; i < coins.length; i++) {for (int j = coins[i]; j <= amount; j++) {dp[j] = Math.min(dp[j - coins[i]] + 1, dp[j]);}}if (dp[amount] == 10001)return -1;return dp[amount];}
}

279. 完全平方数

题目

279. 完全平方数 - 力扣(LeetCode)

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 1:

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 104

思路

代码随想录:279.完全平方数

视频讲解:LeetCode:279.完全平方数

同上一题322. 零钱兑换

题解

java">class Solution {public int numSquares(int n) {int[] dp = new int[n + 1];for (int i = 0; i < dp.length; i++) {dp[i] = 10001;}dp[0] = 0;for (int i = 1; i * i <= n; i++) {for (int j = i * i; j <= n; j++) {dp[j] = Math.min(dp[j - i * i] + 1, dp[j]);}}return dp[n];}
}

139.单词拆分

题目

139. 单词拆分 - 力扣(LeetCode)

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

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

示例 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

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • swordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同

思路

视频讲解:LeetCode:139.单词拆分

代码随想录:139.单词拆分

单词 => 物品,字符串 => 背包,单词可以重复使用说明是完全背包问题。

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp数组定义为布尔数组,dp[i]表示字符串长度为 i 时能否拆分为字典中出现的单词。
  2. 确定递推公式:定义当前遍历到的单词为 str,如果 dp[i - str.length()] == true,且 str 与与字符串中对应的子串相等,dp[i] = true
  3. 数组初始化:dp[0] = true,其余元素定义为 0。
  4. 确定遍历顺序:本题求的是排列,因此外层 for 循环遍历背包,内层 for 循环遍历物品,由于是完全背包,使用顺序遍历。
  5. 举例推导:

139.单词拆分

题解

独立题解:

java">class Solution {public boolean wordBreak(String s, List<String> wordDict) {boolean[] dp = new boolean[s.length() + 1];dp[0] = true;for (int i = 0; i < dp.length; i++) {for (int j = 0; j < wordDict.size(); j++) {String str = wordDict.get(j);int len = str.length();if (i - len >= 0 && s.substring(i - len, i).equals(str) && dp[i - len]) {dp[i] = true;}}}return dp[s.length()];}
}

参考题解:

java">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;

思路

代码随想录:多重背包理论基础

多重背包问题可以拆解为01背包,在最里层再添加一个 for 循环遍历每一种商品的数量。

题解

java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);/*** bagWeight:背包容量* n:物品种类*/int bagWeight, n;//获取用户输入数据,中间用空格隔开,回车键换行bagWeight = sc.nextInt();n = sc.nextInt();int[] weight = new int[n];int[] value = new int[n];int[] nums = new int[n];for (int i = 0; i < n; i++) weight[i] = sc.nextInt();for (int i = 0; i < n; i++) value[i] = sc.nextInt();for (int i = 0; i < n; i++) nums[i] = sc.nextInt();int[] dp = new int[bagWeight + 1];//先遍历物品再遍历背包,作为01背包处理for (int i = 0; i < n; i++) {for (int j = bagWeight; j >= weight[i]; j--) {//遍历每种物品的个数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]);}
}

http://www.ppmy.cn/news/1542516.html

相关文章

JS补原型链

在JavaScript中&#xff0c;补足一个对象的原型链通常是指确保一个对象继承自另一个对象。这涉及到原型和构造函数。 对于构造函数&#xff08;通常首字母大写&#xff0c;如 Animal&#xff09;&#xff0c;它们有一个 prototype 属性&#xff0c;这个属性是一个对象&#xf…

Spring Boot:植物健康监测的智能时代

3系统分析 3.1可行性分析 通过对本植物健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本植物健康系统采用SSM框架&#xff0c;JAVA作为开发语言&#…

Python 自动化运维:Python基础知识

Python 自动化运维&#xff1a;Python基础知识 目录 &#x1f4ca; Python 基础复习 数据类型、控制结构与常用函数面向对象编程&#xff08;OOP&#xff09;与类的使用函数式编程概念与 lambda 表达式异常处理与日志记录的基本实践 1. &#x1f4ca; Python 基础复习 数据…

kubernetes中的ingress-nginx

华子目录 ingress-nginxingress-nginx功能 部署ingress及使用注意 ingress的高级用法1.基于路径的访问2.基于域名的访问3.建立tls加密4.建立auth认证5.rewrite重定向 ingress-nginx 官网&#xff1a;https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters …

JVM(HotSpot):GC之G1垃圾回收器

文章目录 一、简介二、工作原理三、Young Collection 跨代引用四、大对象问题 一、简介 1、适用场景 同时注重吞吐量&#xff08;Throughput&#xff09;和低延迟&#xff08;Low latency&#xff09;&#xff0c;默认的暂停目标是 200 ms超大堆内存&#xff0c;会将堆划分为…

动态规划 —— 斐波那契数列模型-解码方法

1. 解码方法 题目链接&#xff1a; 91. 解码方法 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/decode-ways/description/ 2. 题目解析 1. 对字母A - Z进行编码1-26 2. 11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 3. 0n不能解码 4. …

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…

static、 静态导入、成员变量的初始化、单例模式、final 常量(Content)、嵌套类、局部类、抽象类、接口、Lambda、方法引用

static static 常用来修饰类的成员&#xff1a;成员变量、方法、嵌套类 成员变量 被static修饰&#xff1a;类变量、成员变量、静态字段 在程序中只占用一段固定的内存&#xff08;存储在方法区&#xff09;&#xff0c;所有对象共享可以通过实例、类访问 (一般用类名访问和修…