第四十五天|dp

今天的题都是完全背包题

70. Climbing Stairs

重新考虑这道题.那么dp[i]代表的就是爬到i为止有多少种方法.递推公式就是dp[i]+=dp[i-j].因为只能爬一步或者两步,所以j只能取1或者2.

初始值至少有一种方法,所以dp[0]=1

这是在找排列,并没有顺序,所以先背包后物品

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==1:
            return 1
        dp=[0 for _ in range(n+1)]
        dp[0]=1
        for i in range(1,n+1):
            for j in range(1,3):
                if i>=j:
                    dp[i]+=dp[i-j]
        return dp[-1]

322. Coin Change

这道题dp[i]代表的是到i为止最少需要多少枚钱币. 递推公式就是dp[i]=min(dp[i],dp[i-j]+1).

初始值0时不用钱币,所以dp[0]=0. dp整体初值要inf因为再找最小的方法

这是在找排列,并没有顺序,所以先背包后物品

如果最终dp[-1]是inf说明没有找到所以要输出-1,反之输出值即可

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp=[float('inf') for _ in range(amount+1)]
        dp[0]=0
        for i in range(1,amount+1):
            for coin in coins:
                if i>=coin:
                    dp[i]=min(dp[i],dp[i-coin]+1)
        if dp[-1]==float('inf'):
            return -1
        return dp[-1]

279. Perfect Squares

这道题还是完全背包问题. 这道题dp[i]代表的是到i为止需要多少个num组成.dp[i]=min(dp[i],dp[i-j*j]+1).

初始值0时没有可用的数,所以dp[0]=0. dp整体初值要inf因为再找最小的方法

这是在找排列,并没有顺序,所以先背包后物品,物品的平方要小于i

class Solution:
    def numSquares(self, n: int) -> int:
        dp=[float('inf') for _ in range(n+1)]
        dp[0]=0
        for i in range(1,n+1):
            for j in range(1,int(sqrt(i)+1)):
                dp[i]=min(dp[i],dp[i-j*j]+1)
        return dp[-1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值