【ACM】—蓝桥杯大一暑期集训Day3
发布人:shili8
发布时间:2024-12-26 08:28
阅读次数:0
**ACM — 蓝桥杯大一暑期集训 Day3**
### **一、前言**
在前两天的集训中,我们已经学习了基本的算法思想和数据结构。今天,我们将继续深入探讨这些主题,并且开始接触一些更复杂的问题。
### **二、动态规划**
#### **2.1什么是动态规划?**
动态规划(Dynamic Programming)是一种解决问题的方法,通过分解一个大问题为多个小问题,然后逐步求解这些小问题,最终得到原问题的答案。这种方法特别适用于有重叠子问题的递归问题。
#### **2.2 动态规划的特点**
动态规划的特点是:
*问题可以分解为多个子问题* 子问题之间存在重叠* 每个子问题的答案只需要计算一次#### **2.3 动态规划的步骤**
动态规划的步骤是:
1. 分解原问题为多个子问题2. 逐步求解这些子问题3. 使用之前计算过的结果来避免重复计算### **三、背包问题**
#### **3.1什么是背包问题?**
背包问题是一种经典的动态规划问题。假设有一个背包,容量为 `W`,有 `n` 个物品,每个物品的重量和价值分别为 `(w[i], v[i])`。要求求出在不超过背包容量的情况下,能获得的最大价值。
#### **3.2 背包问题的动态规划**
def knapsack(W, w, v): n = len(w) dp = [[0] * (W +1) for _ in range(n +1)] for i in range(1, n +1): for j in range(1, W +1): if w[i -1] > j: dp[i][j] = dp[i -1][j] else: dp[i][j] = max(dp[i -1][j], dp[i -1][j - w[i -1]] + v[i -1]) return dp[n][W] # 测试w = [2,3,4,5] v = [10,20,30,40] W =7print(knapsack(W, w, v)) # 输出:60
### **四、贪婪算法**
#### **4.1什么是贪婪算法?**
贪婪算法是一种简单的算法思想,通过一步一步地选择最优解来解决问题。这种方法特别适用于有明确目标和约束的场景。
#### **4.2 贪婪算法的特点**
贪婪算法的特点是:
* 每一步都选择最优解* 不考虑后续步骤对当前决策的影响#### **4.3 贪婪算法的应用**
贪婪算法广泛应用于各种场景,例如:
* 活动选择问题* 资源分配问题*优化问题### **五、总结**
在今天的集训中,我们学习了动态规划和贪婪算法这两种重要的算法思想。通过这些例子,我们可以看到这些方法如何帮助我们解决复杂的问题。
**参考资料:**
* 《算法导论》(第三版)
* 《数据结构与算法分析》(第二版)
**注释:**