一、题目解析:最少硬币问题
题目描述: 小C有多种不同面值的硬币,每种硬币的数量是无限的。他希望知道如何使用最少数量的硬币,凑出给定的总金额 ( N )。
示例:
- 输入:
coins = [1, 2, 5],amount = 18 - 输出:
[5, 5, 5, 2, 1]
思路解析:
- 定义状态:用
dp[i]表示凑出金额i所需的最少硬币数量。 - 初始化:
dp[0] = 0,因为凑出金额 0 不需要任何硬币。其他dp[i]初始化为一个很大的数(表示初始时无法凑出该金额)。 - 状态转移:对于每个金额
i,遍历所有硬币面值coin,如果i - coin是非负的,则更新dp[i]为dp[i - coin] + 1的最小值。 - 构造结果:从
dp[amount]开始回溯,找到使用的硬币组合。
图解:
金额: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
dp: 0 1 1 2 2 1 2 2 3 3 2 3 3 4 4 3 4 4 3
代码详解:
def min_coins(coins, amount):
dp = [float('inf')] * (amount + 1)
dp[0] = 0
prev_coin = [-1] * (amount + 1)
for i in range(1, amount + 1):
for coin in coins:
if i - coin >= 0 and dp[i - coin] + 1 < dp[i]:
dp[i] = dp[i - coin] + 1
prev_coin[i] = coin
if dp[amount] == float('inf'):
return []
result = []
current_amount = amount
while current_amount > 0:
result.append(prev_coin[current_amount])
current_amount -= prev_coin[current_amount]
return result
# 测试样例
print(min_coins([1, 2, 5], 18)) # 应输出: [5, 5, 5, 2, 1]
print(min_coins([1, 3, 4], 6)) # 应输出: [3, 3]
print(min_coins([5], 10)) # 应输出: [5, 5]
二、知识总结
-
动态规划:
- 动态规划是一种通过将问题分解成子问题,并利用子问题的解来构建原问题的解的方法。
- 关键在于定义状态和状态转移方程。例如,在最少硬币问题中,
dp[i]表示凑出金额i所需的最少硬币数量。
-
状态转移方程:
- 状态转移方程是动态规划的核心。在最少硬币问题中,状态转移方程为
dp[i] = min(dp[i], dp[i - coin] + 1),表示当前金额i的最少硬币数可以通过前一个金额i - coin的最少硬币数加 1 得到。
- 状态转移方程是动态规划的核心。在最少硬币问题中,状态转移方程为
-
回溯法:
- 回溯法用于从
dp数组中构造最终的结果。通过记录每个状态的前一个状态,可以回溯构造最终的结果。
- 回溯法用于从
学习建议:
- 动态规划问题通常需要明确状态和状态转移方程。
- 练习时多画图,理解状态之间的关系。
- 多做练习,熟悉常见的动态规划问题类型。
三、学习计划
-
制定刷题计划:
- 每日目标:每天至少完成 2-3 道题目,确保持续进步。
- 每周主题:每周选择一个主题进行专项练习,如动态规划、贪心算法等。
- 每月回顾:每月回顾并复习之前做过的题目,巩固知识点。
-
利用错题进行针对性学习:
- 分析错误原因:对于做错的题目,仔细分析错误原因,理解正确的解法。
- 整理错题集:将错题整理成文档,定期复习。
- 寻找类似题目:寻找类似的题目进行练习,确保掌握相关知识点。
-
总结与分享:
- 每周总结:每周总结一次学习内容,梳理知识点。
- 分享心得:在社区或平台上分享自己的解题思路和心得,互相交流学习经验。
四、工具运用
-
结合AI刷题功能:
- 筛选题目:使用豆包MarsCode AI刷题平台,根据难度和类型筛选题目。
- 利用提示:利用AI提供的提示和解释,帮助理解题目和解法。
- 跟踪进度:记录每次刷题的时间和正确率,跟踪学习进度。
-
与其他学习资源相结合:
- 在线课程:结合在线课程和书籍,系统学习算法和数据结构。
- 编程竞赛:参加编程竞赛和挑战赛,提高实战能力。
- 编程社区:加入编程社区,参与讨论和交流,获取更多学习资源和经验分享。
通过以上方法,你可以更高效地利用豆包MarsCode AI刷题平台,提升编程技能,更好地理解和掌握各种算法和数据结构。希望这篇学习笔记对你有所帮助!如果有任何疑问或需要进一步的帮助,请随时提问。