代码随想录算法训练45 | 动态规划part07

 70. 爬楼梯 (进阶) 

这道题目 爬楼梯之前我们做过,这次再用完全背包的思路来分析一遍 

代码随想录

 322. 零钱兑换  

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

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

这句话结合本题 大家要好好理解。

视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili

代码随想录

状态转移方程的推导:

dp[j] 表示组成金额 j 所需的最小硬币数量,这里的推导过程基于以下逻辑:

假设我们有硬币面值列表 coins,当前正在考虑的硬币面值为 coins[i],我们要计算目标金额 j;

如果可以使用当前硬币面值 coins[i] 来凑成金额 j(即 j >= coins[i]),那么有两种情况:
· 不使用当前硬币 coins[i]:这时,凑成金额 j 所需的最小硬币数量就是之前已计算出的 dp[j];
· 使用至少一个当前硬币 coins[i]:首先我们需要用掉一个 coins[i] 硬币来得到金额 j - coins[i],然后再加上这次使用的1个硬币,所以总硬币数为 dp[j - coins[i]] + 1;

因此,在这两种选择中,我们应该选择硬币数量较少的那个方案作为最优解,即取两者的较小值。于是就得到了状态转移方程:

dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

通过不断迭代所有硬币和所有可能的目标金额组合,最终在 dp[amount] 中得到组成目标金额所需的最小硬币数量。

 279.完全平方数  

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做 

视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili

代码随想录

你可能感兴趣的:(LeetCode刷题训练,算法,动态规划)