动态规划:完全背包、零钱兑换 II、组合总和 Ⅳ、爬楼梯进阶、零钱兑换、完全平方数

2023-05-16

完全背包

https://www.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%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html#%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85
对于一维dp

  • 01背包,一个物品只能放一次,遍历顺序,先物品,再背包逆序(从大到小),for循环内外层不可以颠倒(二维dp可以颠倒)
  • 完全背包,一个物品可以放多次,遍历顺序,先物品,再背包顺序(从小到大),for循环内外层可以颠倒

注:纯完全背包问题,其for循环的先后循环是可以颠倒的!

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

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

注:dp[j]:凑成总金额j的货币组合数为dp[j], dp[0] = 1

首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。

从dp[i]的含义上来讲就是,凑成总金额0的货币组合数为1。

下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]

518. 零钱兑换 II

在这里插入图片描述
tips:求的方法所以是组合数,完全背包,硬币数相当于物品,且可以用多次。
如果求组合数就是外层for循环遍历物品,内层for遍历背包。

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

首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。

从dp[i]的含义上来讲就是,凑成总金额0的货币组合数为1。

下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        dp = [0] * (amount + 1)
        # 组合0的金额 也有0这1种方法
        dp[0] = 1

        # 完全背包(背包容量正序),组合数 (先物品后背包),求方法(之前的方法数累加求和,不加1)
        for coin in coins:
            for j in range(coin, amount + 1, 1):
                dp[j] += dp[j - coin]
        return dp[-1]

377. 组合总和 Ⅳ

在这里插入图片描述
tips:排序数,先背包,后物品,dp[i]: 凑成目标正整数为i的排列个数为dp[i]
在这里插入图片描述

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp = [0] * (target + 1)
        dp[0] = 1

        # 完全背包(背包容量正序),排序数 (先背包后物品),求方法数(之前的方法数累加求和,不加1)
        for j in range(target + 1):
            for num in nums:
                if j >= num:
                    dp[j] += dp[j - num]
        return dp[-1]

爬楼梯进阶

在这里插入图片描述
在这里插入图片描述
tips :377. 组合总和 Ⅳ (opens new window)基本就是一道题了。

在动态规划:494.目标和 (opens new window)、 动态规划:518.零钱兑换II (opens new window)、动态规划:377. 组合总和 Ⅳ (opens new window)中我们都讲过了,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];

递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = [0]*(n + 1)
        dp[0] = 1
        m = 2
        # 遍历背包
        for j in range(n + 1):
            # 遍历物品 可以从选[1,m]阶楼梯
            for step in range(1, m + 1):
                if j >= step:
                    dp[j] += dp[j - step]
        return dp[n]

322. 零钱兑换

在这里插入图片描述
tips:这里求的是最少硬币的个数,所以如果选了coin[i] 则还剩下j - coin[i]的空间 ,同时硬币个数加1,所以递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j])

初始化:
首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
其他下标对应的数值呢?
考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。
所以下标非0的元素都是应该是最大值

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        maxv = float('inf')
        dp = [maxv] * (amount + 1)
        dp[0] = 0

        # 一个物品用多次,完全背包(背包容量正序),排序数、组合数不影响所以顺序不影响(这里先物品后背包),求最小数(min,加1)
        for coin in coins:
            for j in range(coin, amount + 1, 1):
                dp[j] = min(dp[j], dp[j - coin] + 1)
        
        # 判断存在不存在这样的组成
        if dp[-1] != maxv:
            return dp[-1]
        else:
            return -1
        

279.完全平方数

在这里插入图片描述
tips:完全背包(背包容量正序),最小值(min,+ 1),内外顺序都可以

class Solution:
    def numSquares(self, n: int) -> int:
        maxv = float('inf')
        dp = [maxv] * (n + 1)
        dp[0] = 0

        #完全背包(背包容量正序),顺序不影响(这里先物品后背包),求最小数(min,加1)
        # i取值 [1,n的开平方+1]
        for i in range(1, int(n**0.5) + 1):
            for j in range(i*i, n + 1, 1):
                dp[j] = min(dp[j], dp[j - i * i] + 1)

        
        return dp[-1]

总结:

  • 01背包,一个物品只能放一次,遍历顺序,先物品,再背包逆序(从大到小),for循环内外层不可以颠倒(二维dp可以颠倒)
  • 完全背包,一个物品可以放多次,遍历顺序,先物品,再背包顺序(从小到大),for循环内外层可以颠倒。但是!! 组合数先物品后背包,排序数先背包后物品。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划:完全背包、零钱兑换 II、组合总和 Ⅳ、爬楼梯进阶、零钱兑换、完全平方数 的相关文章

  • SwiftUI如何修改页面状态?@state的使用

    在SwiftUI开发中流传一种说法 xff1a 视图是状态的函数 这句话什么意思呢 xff1f 我们在玩游戏的时候 xff0c 死了几次 xff0c 得到几分 xff0c 收集了一些道具 xff0c 或者捡到武器 xff0c 在应用程序中
  • Building for iOS Simulator, but the linked and embedded framework 'App.frame'

    在使用android studio运行flutter项目时 xff0c 报如下错误 xff1a building for is simulator but the linked and embedded framework app fram
  • Xcode编译报 library not found for -lstdc++ 问题

    背景 xff1a 最近在编译某第三方提供的SDK的时候 xff0c 发现编译过不了 xff0c 报错信息如下 xff1a 提示library not found for lstdc 43 43 xff0c 开始以为没有导入对应的库 xff0
  • 使用NSProxy和NSObject设计代理类的差异

    经常发现在一些需要使用消息转发而创建代理类时 不同的程序员都有着不同的使用方法 有些采用继承于NSObject 而有一些采用继承自NSProxy 二者都是Foundation框架中的基类 并且都遵守了这个协议 从命名和文档中看NSProxy
  • Flutter中如何获取widget的大小和位置?

    在我们实际的开发中 xff0c 会有要获取某个widget的大小和位置的需求 xff0c 但是widget本身并没有对应的属性获取size和position xff0c 怎么办呢 xff1f 看官莫急 xff0c 且往下看 我们首先创建一个
  • ios中修改状态栏颜色的方法

    工作中会经常遇到需要修改状态栏显示的颜色 xff0c 实践发现 xff0c 修改其实很简单 xff0c 只需要在项目的infoPlist文件中添加一项 xff1a View controller based status bar appea
  • OC代码中使用Swift文件的实践

    最近在研究swift xff0c 就我看来 xff0c swift确实是比OC更优秀的语言 xff0c 这可以体现在很多方面 xff0c 网上已经对比的很透彻 xff0c 就不一一赘述 今天研究了一下如何在OC项目中使用swift文件 xf
  • iOS使用socketIO实现长连接

    公司是做金融相关 xff0c 最近需要实现一个金融客户端必不可少的东西 xff1a K线图 这个东西如果是自己从头来搞 xff0c 可真的不是一件简单的事 xff0c 幸好 xff0c 在这个领域有很多的先驱 xff0c 已经在我们之前造好
  • Mac升级自带python到最新版本有轻功

    Mac电脑自带python xff0c 但是一般都是python的低版本 xff0c 如今越来越多的人转向了python3 xff0c 故而很有必要将其升级 xff0c 但是mac有些软件是依赖于自带python的 xff0c 所以不建议删
  • 2020-10-26关于虚拟机中的HWADDR和MACADDR地址

    https blog csdn net weixin 41374755 article details 106150956 utm medium 61 distribute pc aggpage search result none tas
  • JetBrains软件怎么设置中文?

    etbrains全家桶基本都是英文的 xff0c 有的朋友使用起来很不方便 xff0c 那么jetbrains全家桶怎么汉化呢 xff1f 现在来为大家带来JetBrains软件汉化教程 xff01 下面就以IntelliJ IDEA 20
  • SpringMVC常见面试题总结(超详细回答)

    1 什么是Spring MVC xff1f 简单介绍下你对springMVC的理解 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架 xff0c 通过把Model xff0c View xff0c
  • 微信聊天记录导出

    想把微信记录导出来 xff0c 并保存成txt或者csv格式的文件 xff0c 网上常用的方法是先把手机root xff0c 然后再获取微信聊天记录数据库 xff0c 然后再对数据库破解 有些android手机进行root xff0c 可能
  • iOS开发之NSMethodSignature(方法签名)

    OC中方法调用有三种 xff1a 第一种 xff1a 直接调用 span class token operator span span class token punctuation span span class token keywor
  • ios开发之离屏渲染

    前言 UIView和CALayer关系 UIView继承自UIResponder xff0c 可以处理系统传递过来的事件 xff0c 如 xff1a UIApplication UIViewController UIView xff0c 以
  • ios自定制Tabbar

    这是得物iOS开发一道面试题 xff0c 要求详细描述自定义Tabbar UITabBarController也可以轻松地管理多个控制器 轻松完成控制器之间的切换 xff0c UITabBarController的展现形式就是平时大家手机上
  • ios逆向开发

    对ios逆向开发感兴趣的小伙伴可以查看一下链接内容 xff1a ios逆向开发
  • iOS开发常用加密

    Https加密流程详见博主Https加密流程第十条 其他常用加密方式 一 Base64 Base64加密原理 xff1a 1 原本数据一个字符为8bit xff0c 每3个字符为一组 xff0c 即 xff1a 3 8 2 编码过程中 xf
  • iOS开发细碎知识点总结二

    struct和class的区别 我们先了解栈和堆的区别 1 栈的特点 分配空间小 但是存在栈上的数据访问效率高 2 堆的特点 分配空间相对较大 但是数据访问相对于栈 效率底下 swift中struct与的class的区别 1 class是引
  • iOS开发之相册

    需求一 xff1a 简单的选择一张图片 在iOS开发中如果要调用相机拍取照片或者是直接获取相册中的照片 xff0c 那么调用UIImagePickerController是个不错的选择 UIImagePickerController继承于U

随机推荐