这道题目?爬楼梯之前我们做过,这次再用完全背包的思路来分析一遍?
如果求组合数就是外层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]
?中得到组成目标金额所需的最小硬币数量。
本题?和?322.?零钱兑换?基本是一样的,大家先自己尝试做一做?