代码随想录算法训练营第45天 | 爬楼梯(进阶) 322.零钱兑换 279.完全平方数

代码随想录系列文章目录

动态规划篇 —— 完全背包


文章目录

  • 代码随想录系列文章目录
  • 爬楼梯(进阶 完全背包)
  • 322.零钱兑换
  • 279.完全平方数


爬楼梯(进阶 完全背包)

本题稍加改动就是一道面试好题。

改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?

1阶,2阶,… m阶就是物品,楼顶就是背包。

每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。

问跳到楼顶有几种方法其实就是问装满背包有几种方法。

此时大家应该发现这就是一个完全背包问题了!这道题就和那个377.组和总和是一样的

1.dp[j]: 爬到有j个台阶的楼顶,有多少种方法
2.状态转移: dp[j] += dp[j-i] 当前在j阶楼梯上可能是 由于 dp[j-1], dp[j-2] … dp[j-i]转移过来
3.base case: dp[0] = 1
4.遍历顺序和解的位置
求排列问题,即:1、2 步 和 2、1 步都是上三个台阶,但是这两种方法不一样!所以需将target放在外循环,将nums放在内循环。都是正序遍历
解的位置就是dp[target]

def climbstairs(n):
	dp = [0] * (n+1)
	dp[0] = 1
	for j in range(1, n+1):  #遍历容积,n阶台阶
		for i in range(1, m+1):  #遍历物品, m表示最多能爬几阶
			if j >= i: dp[j] += dp[j-i]
	return dp[n]

这就是完全背包,求所有排列有多少种的一个解法

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

322.零钱兑换

题目链接
首先每种硬币是无限的,依然是经典的完全背包

题目要求,希望硬币数量最小,去凑出target

那么1.状态定义: dp[j] 就是凑足总额为j所需钱币的最少个数

2.状态转移
还是完全背包的套路,不选coins[i], 选coins[i], 只不过两者要选一个小的
dp[j] = min(dp[j], dp[j-coins[i]]+1)

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

4.遍历顺序以及解的位置
本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。所以本题并不强调集合是组合还是排列。
如果是求完全背包中组合的个数的话,先遍历物品
如果是求完全背包中排列的个数的话,先遍历体积
这道题不是求排列 那么我就习惯先遍历物品
最后解的位置还是在dp[amount]

def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [10001] * (amount+1)
        dp[0] = 0
        for i in coins:
            for j in range(i, amount+1):
                dp[j] = min(dp[j], dp[j-i]+1)
        if dp[amount] == 10001: return -1
        return dp[amount]

279.完全平方数

题目链接

这道题和上道题基本是一模一样的,只是要搞明白谁是物品,谁是容积
首先,物品是那些 11 22 3*3 …这些平方数,背包容积则是n
我们dp[j]是用这些平方数填背包所用的最小数量

我们物品从1开始,物品的平方不能超过背包容积吧,结束位置就是这个位置
其余的和322零钱兑换一模一样,这俩题放在一起学习

def numSquares(self, n: int) -> int:
        dp = [10001] * (n+1)
        dp[0] = 0
        for i in range(1, math.floor(math.sqrt(n))+1):
            for j in range(i*i, n+1):
                dp[j] = min(dp[j], dp[j-i*i]+1)
        return dp[n]

你可能感兴趣的:(代码随想录算法训练营打卡,算法,动态规划)