学习笔记:使用豆包MarsCode AI刷题平台提升编程技能

69 阅读4分钟

一、题目解析:最少硬币问题

题目描述: 小C有多种不同面值的硬币,每种硬币的数量是无限的。他希望知道如何使用最少数量的硬币,凑出给定的总金额 ( N )。

示例

  • 输入:coins = [1, 2, 5], amount = 18
  • 输出:[5, 5, 5, 2, 1]

思路解析

  1. 定义状态:用 dp[i] 表示凑出金额 i 所需的最少硬币数量。
  2. 初始化dp[0] = 0,因为凑出金额 0 不需要任何硬币。其他 dp[i] 初始化为一个很大的数(表示初始时无法凑出该金额)。
  3. 状态转移:对于每个金额 i,遍历所有硬币面值 coin,如果 i - coin 是非负的,则更新 dp[i]dp[i - coin] + 1 的最小值。
  4. 构造结果:从 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]

二、知识总结

  1. 动态规划

    • 动态规划是一种通过将问题分解成子问题,并利用子问题的解来构建原问题的解的方法。
    • 关键在于定义状态和状态转移方程。例如,在最少硬币问题中,dp[i] 表示凑出金额 i 所需的最少硬币数量。
  2. 状态转移方程

    • 状态转移方程是动态规划的核心。在最少硬币问题中,状态转移方程为 dp[i] = min(dp[i], dp[i - coin] + 1),表示当前金额 i 的最少硬币数可以通过前一个金额 i - coin 的最少硬币数加 1 得到。
  3. 回溯法

    • 回溯法用于从 dp 数组中构造最终的结果。通过记录每个状态的前一个状态,可以回溯构造最终的结果。

学习建议

  • 动态规划问题通常需要明确状态和状态转移方程。
  • 练习时多画图,理解状态之间的关系。
  • 多做练习,熟悉常见的动态规划问题类型。

三、学习计划

  1. 制定刷题计划

    • 每日目标:每天至少完成 2-3 道题目,确保持续进步。
    • 每周主题:每周选择一个主题进行专项练习,如动态规划、贪心算法等。
    • 每月回顾:每月回顾并复习之前做过的题目,巩固知识点。
  2. 利用错题进行针对性学习

    • 分析错误原因:对于做错的题目,仔细分析错误原因,理解正确的解法。
    • 整理错题集:将错题整理成文档,定期复习。
    • 寻找类似题目:寻找类似的题目进行练习,确保掌握相关知识点。
  3. 总结与分享

    • 每周总结:每周总结一次学习内容,梳理知识点。
    • 分享心得:在社区或平台上分享自己的解题思路和心得,互相交流学习经验。

四、工具运用

  1. 结合AI刷题功能

    • 筛选题目:使用豆包MarsCode AI刷题平台,根据难度和类型筛选题目。
    • 利用提示:利用AI提供的提示和解释,帮助理解题目和解法。
    • 跟踪进度:记录每次刷题的时间和正确率,跟踪学习进度。
  2. 与其他学习资源相结合

    • 在线课程:结合在线课程和书籍,系统学习算法和数据结构。
    • 编程竞赛:参加编程竞赛和挑战赛,提高实战能力。
    • 编程社区:加入编程社区,参与讨论和交流,获取更多学习资源和经验分享。

通过以上方法,你可以更高效地利用豆包MarsCode AI刷题平台,提升编程技能,更好地理解和掌握各种算法和数据结构。希望这篇学习笔记对你有所帮助!如果有任何疑问或需要进一步的帮助,请随时提问。