首页 > 其他分享 >Day 41 | 322. 零钱兑换 、 279.完全平方数、139.单词拆分

Day 41 | 322. 零钱兑换 、 279.完全平方数、139.单词拆分

时间:2024-07-07 23:31:08浏览次数:14  
标签:背包 apple 41 322 遍历 物品 279 com dp

322. 零钱兑换

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

这句话结合本题 大家要好好理解。
视频讲解:https://www.bilibili.com/video/BV14K411R7yv
https://programmercarl.com/0322.零钱兑换.html
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

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

示例 1:

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

思考

本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。

所以本题并不强调集合是组合还是排列。背包和物品的遍历先后不重要。

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        # dp[i] 组成总数为i的的硬币最小组合长度
        dp = [float('inf')] * (amount+1)
        dp[0] = 0
        # 先物品再背包
        for coin in coins:
            for i in range(1,amount+1):
                if i-coin >=0:
                    dp[i] = min(dp[i-coin]+1,dp[i])
        if dp[-1] == float('inf'):
            return -1
        else:
            return dp[-1]

279.完全平方数

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做
视频讲解:https://www.bilibili.com/video/BV12P411T7Br
https://programmercarl.com/0279.完全平方数.html

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

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

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

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

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

思考

跟零钱兑换一样,完全背包问题。
本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。
所以本题并不强调集合是组合还是排列。背包和物品的遍历先后不重要。

class Solution:
    def numSquares(self, n: int) -> int:
        # dp[i] 容量i的背包,装满的最少组合数
        dp = [float('inf')] * (n+1)
        dp[0] = 0
        #先物品再背包 求组合数
        for j in range(1,n+1):
            if j**2 > n:
                break
            for i in range(1,n+1):
                if i>=j**2:
                    dp[i] = min(dp[i],dp[i-j**2]+1)
        return dp[-1]

139.单词拆分

视频讲解:https://www.bilibili.com/video/BV1pd4y147Rh
https://programmercarl.com/0139.单词拆分.html

给定一个非空字符串 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

思考

物品可以重复选取,完全背包问题。
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
而本题其实我们求的是排列数,为什么呢。 拿 s = "applepenapple", wordDict = ["apple", "pen"] 举例。

"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。

"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。

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

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        #dp[i] 表示 s[0:i]是否可以拆分 左闭右开
        dp = [False]* (len(s)+1)
        dp[0] = True
        for i in range(1,len(s)+1):
            for word in wordDict:
                if i >=len(word):
                    #print(word,len(word),i)
                    dp[i] = dp[i-len(word)] and s[i-len(word):i] == word
                    if dp[i]:
                        break  
        return dp[len(s)]

关于多重背包,你该了解这些!

https://programmercarl.com/背包问题理论基础多重背包.html

背包问题总结篇!

https://programmercarl.com/背包总结篇.html

标签:背包,apple,41,322,遍历,物品,279,com,dp
From: https://www.cnblogs.com/forrestr/p/18289116

相关文章

  • 【LeetCode 0141】【链表】【双指针之快慢指针】判断给定单链表是否存在环
    LinkedListCycleGivenhead,theheadofalinkedlist,determineifthelinkedlisthasacycleinit.Thereisacycleinalinkedlistifthereissomenodeinthelistthatcanbereachedagainbycontinuouslyfollowingthe next pointer.Internal......
  • 541. Reverse String II
    Givenastringsandanintegerk,reversethefirstkcharactersforevery2kcharacterscountingfromthestartofthestring.Iftherearefewerthankcharactersleft,reverseallofthem.Iftherearelessthan2kbutgreaterthanorequaltokchara......
  • P5441
    P5441&blog神仙题目。tips:后面把\(4\)个点说成一个组。我们先考虑一个组怎么连才不是强联通的。一个点A向另外三个点BCD连一条有向边。在不满足第一种的情况下,BCD向另一个点A连一条有向边。AB之间连有向边,CD之间连无向边,然后AC和AD连一条有向边,BC......
  • 417、基于51单片机的热水器(燃气,温度,LCD1602,阀门PID)(程序+Proteus仿真+原理图+流程图+
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择显示器选择方案一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择......
  • R语言数据分析案例41-上证00001股票多元线性回归和预测
    一、研究背景和意义随着经济的迅速发展和技术的进步,炒股已经不再是少数金融专业人士的专属领域,而是成为了社会广泛关注的话题。股市投资既有赚取丰厚收益的机会,也伴随着一定的风险,因此对股票未来走势的预测具有极为重要的现实意义。预测模型中的多元线性回归模型和时间序列模......
  • 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串Ⅱ、54.替换数字(卡码网
    344简单写个循环1classSolution{2public:3voidreverseString(vector<char>&s){4chartmp;5intlen=s.size();6for(inti=0;i<len/2;i++){7tmp=s[i];8s[i]=s[len-......
  • 基于STM32单片机的智能垃圾桶控制系统 语音识别 LD3322 垃圾分类 红外感应 超声波满溢
        随着社会科学技术的飞速发展,人们的生活质量和速度也在不断提高。大多数传统的家用垃圾桶已经过时且缺乏新颖性,并且缺乏人性化设计。使用起来既不方便也不卫生,并且所有的生活垃圾和废物垃圾都被均匀地装载,没有经过仔细的分类。随之而来的是,清洁工的任务量正以几何速......
  • 基于STM32单片机的智能垃圾桶控制系统 语音识别LD3322 垃圾分类 火灾检测 金属检测 成
        随着社会科学技术的飞速发展,人们的生活质量和速度也在不断提高。大多数传统的家用垃圾桶已经过时且缺乏新颖性,并且缺乏人性化设计。使用起来既不方便也不卫生,并且所有的生活垃圾和废物垃圾都被均匀地装载,没有经过仔细的分类。随之而来的是,清洁工的任务量正以几何速......
  • OpenHarmony移植小型系统exynos4412(二)
    产品配置规则1、概述产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、部件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:vendor/{产品解决方案厂商}/{产品名称}_。产品解决方案的目录树规则如下:vendor└──company#产品解决方案厂......
  • 代码随想录第四十六天 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换看完想法:此处是求最小值,所以递推公式中含Min,即dp[j]=min(d[[j],dp[j-coins[i]]+1),初始化都为INT_MAX,且dp[0] =0。由于不是求组合数,所以物品和背包重量的遍历先后顺序都是可以的。此处要注意一个细节,如果是物品for外循环,背包从coins[j]开始并且j++,(之......