首页 > 编程语言 >代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 卡码网70. 爬楼梯 (进阶) 322. 零钱兑换 279

代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 卡码网70. 爬楼梯 (进阶) 322. 零钱兑换 279

时间:2024-11-07 20:41:57浏览次数:1  
标签:卡码 背包 int coins amount 零钱 range 兑换 dp

学习资料:https://programmercarl.com/背包问题理论基础完全背包.html#算法公开课

相比于01背包,完全背包中每个物品都可以无限次的放入
组合:先遍历物品,再逆序遍历背包
排列:先逆序遍历背包,再遍历物品

学习记录
卡码网52.携带研究资料(dp[i]代表当重量为i时的最大价值)

点击查看代码
n, v = map(int,input().split())
weight=[]
value = []
for i in range(n):
    wi, vi = map(int, input().split())
    weight.append(wi)
    value.append(vi)

# 构建dp数组
dp = [0]*(v+1)
for i in range(n):
    for j in range(weight[i], v+1):
        dp[j] = max(dp[j], dp[j-weight[i]]+value[i])
print(dp[v])

518.零钱兑换2(dp[i]代表总金额为i时的组合数;我感觉当问方法数或者路线时,递归方程一般是自加)

点击查看代码
class Solution(object):
    def change(self, amount, coins):
        """
        :type amount: int
        :type coins: List[int]
        :rtype: int
        """
        dp = [0]*(amount+1)
        dp[0]=1
        for i in range(len(coins)):
            for j in range(coins[i], amount+1):
                dp[j] += dp[j-coins[i]]
        return dp[amount]
        

377.组合总和4(dp[i]代表总和为i时的组合个数,完全背包+排列)

点击查看代码
class Solution(object):
    def combinationSum4(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # 相当于动态规划的完全背包的排列问题,因为要考虑顺序,则先遍历背包再遍历物品
        dp = [0]*(target+1)
        dp[0]=1
        for j in range(1, target+1):
            for i in range(len(nums)):
                if j >= nums[i]:
                    dp[j] += dp[j-nums[i]]
        return dp[target]
        

70.卡码网爬楼梯(dp[i]代表爬了i阶有多少方法,完全背包+排列)

点击查看代码
def climbStairs(n,m):
    """
    还是完全背包的排列问题,先遍历背包再遍历物品,dp[j]是背包容量为j的时候的走法;
    递推公式里自加的原因是,比如一次能爬一阶或者爬两阶,
    那么到达当前位置的方法数等于到达前一阶的方法数加上到达前两阶的方法数,因为从前一阶到当前位置就一种走法
    """
    dp = [0]*(n+1)
    dp[0]=1
    for j in range(1, n+1):
        for i in range(1, m+1):
            if j>=i:
                dp[j] += dp[j-i]
    return dp[n]
    
if __name__ == "__main__":
    n, m = map(int, input().split())
    print(climbStairs(n, m))
        

322.零钱兑换(dp[i]代表当总金额为i时的最小硬币数,完全背包+组合;求最小数量,就设置dp每个值为无穷大,而dp[0]=0)

点击查看代码
class Solution(object):
    def coinChange(self, coins, amount):
        """
        :type coins: List[int]
        :type amount: int
        :rtype: int
        """
        dp = [float('inf')]*(amount+1)  # 设置初始值均为无穷大
        dp[0] = 0
        for i in range(len(coins)):
            for j in range(coins[i], amount+1):
                if dp[j-coins[i]] != float('inf'):  # 如果前一项不是无穷大,则进行状态转移
                    dp[j] = min(dp[j], dp[j-coins[i]]+1)
        if dp[amount] == float('inf'):
            return -1
        else:
            return dp[amount]
        

279.完全平方数(dp[j]代表和为j时,最少是由多少个完全平方数组成的,这个个数)

点击查看代码
class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [float('inf')]*(n+1)
        dp[0]=0
        for i in range(1, int(n**0.5)+1):
            for j in range(i*i, n+1):
                dp[j] = min(dp[j], dp[j-i*i]+1)
        return dp[n]

139.单词拆分(dp[j]代表字符串长度为j时,是否可以拆分为字典中出现的单词,这个是布尔变量true/false)

点击查看代码
class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        # 这可以用完全背包的排列问题思考
        wordSet  = set(wordDict)
        n = len(s)
        dp = [False]*(n+1)
        dp[0] = True
        for j in range(1, n+1): # 遍历背包
            for i in range(j):   # 遍历单词
                if dp[i] and s[i:j] in wordSet:
                    dp[j] = True
                    break
        return dp[n]

PS:难爆了,根本听不懂,我要多刷呀
颓废了三天,因为昨天面试最简单的二叉树的最大深度都忘了,没有复习二叉树没想到24天就忘光了,惭愧
今天赶紧回顾了一下,后序遍历(左右根)先求左右节点的高度,他们中的最大值加1就是该节点的高度,其中是用递归的方法来计算左右子树的高度滴
加油!多回顾,我可以的!
今天天气不好胃口不好心情不好,所以要早点下班恢复元气,今天的内容明天来补

标签:卡码,背包,int,coins,amount,零钱,range,兑换,dp
From: https://www.cnblogs.com/tristan241001/p/18533922

相关文章

  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串、
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词哔哩哔哩bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作......
  • 微信用不了零钱支付是什么原因
    微信用不了零钱支付可能是由多个因素引起的,包括:1.账户安全问题;2.余额不足或者超过限额;3.网络或系统故障;4.地区性限制;5.支付行为异常等。了解这些因素不仅有助于解决问题,还能提醒我们在日常使用中更加注意账户安全和合规使用。1.账户安全问题账户安全是影响微信零钱支付功能......
  • 雷神口令兑换码,雷神2024新一批CDKEY,免费领取游戏加速时长
    现在社会互联网发展十分的迅速,很多高质量网游也慢慢的走进了玩家的生活,但是想要畅玩游戏的话,少不了游戏加速器的支持。首先要明白,我们在游戏时之所以会出现网络延迟、跳ping、卡顿、丢包等各种问题,都是因为本地网络连接服务器不稳定导致的。尤其是海外网络,游戏服务器距离国内玩家......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......
  • DAY42 ||完全背包理论 | 518. 零钱兑换 II | 377. 组合总和 Ⅳ|70. 爬楼梯 (进阶)
    完全背包理论什么是完全背包:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。不......
  • 代码随想录算法训练营第八天|leetcode344.反转字符串、leetcode541. 反转字符串II、卡
    1leetcode344.反转字符串题目链接:344.反转字符串-力扣(LeetCode)文章链接:代码随想录视频链接:字符串基础操作!|LeetCode:344.反转字符串_哔哩哔哩_bilibili自己的思路:直接使用python的内置函数reverse进行一个操作1.1自己的代码1.1.1python的内置函数classSolution:......
  • 代码随想录算法训练营Day42 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、
    目录完全背包理论基础518.零钱兑换II377.组合总和Ⅳ卡玛网57.爬楼梯(进阶版)完全背包理论基础题目52.携带研究材料(第七期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间......
  • 图论day61:最小生成树|最小生成树理论基础:prim算法、kruskal算法(思维导图版)、53.寻宝(卡
    图论day61:最小生成树|最小生成树理论基础:prim算法、kruskal算法(思维导图版)、53.寻宝(卡码网第七期模拟笔试)最小生成树理论基础(思维导图版)53.寻宝(卡码网第七期模拟笔试)1.prim法2.kruskal法最小生成树理论基础(思维导图版)53.寻宝(卡码网第七期模拟笔试)题目描述在......
  • java项目--零钱通(OOP)
    参考上一篇,项目在主方法中运行的弊端,不易修改,也不能随用随调,结合面向对象的优势,因此有了以下代码的实现:分两个部分,一个类是完成零钱通的各个功能,另一个类用于调用该类的方法。代码如下(功能类展示):/*该类是完成零钱通的各个功能的类*/publicclassOOP{booleanloop......
  • java实现--零钱通
    项目说明:参照微信小程序的零钱通,可以完成收益入账,消费,查看明细,退出系统等功能。以下是功能模块的具体代码:importjava.text.SimpleDateFormat;importjava.util.Scanner;importjava.util.Date;publicclassfirst{publicstaticvoidmain(String[]args){......