十二届蓝桥杯 砝码称重(python)

本文探讨了蓝桥杯竞赛中的一道动态规划题目,涉及砝码称重的计数问题。通过逐个添加砝码,计算可以称出的不同重量,详细阐述了动态规划的实现思路,并提供了样例输入及解题过程。目前解法已通过部分测试用例,寻求优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 动态规划三大题型:计数问题、最值问题、存在性问题。

该题问可以称出多少种不同的重量,属于计数题型。

动态规划实现思路

从一个砝码开始,每个状态列举出当前可以被称出的重量;每次加入一个砝码,这时只需要将上一个状态的每个可以被称出的重量与新的砝码进行组合,即得出当前砝码数量可以被称出的所有重量;一直到最后一个砝码加入,最后一个状态就得出了所有可以被称出的重量

样例输入:3  1  4  6

加入第一个砝码1(状态1)       只能称出重量1

加入第二个砝码4 (状态2)        自身4可以称出        在1的状态1下更新1+4=5,4-1=3,就是1,3,4,5;

加入第三个砝码6          自身6可以称出        在状态2下更新1+6=7,6-1=5,3+6=9,6-3=3,4+6=10,6-4=2,5+6=11,6-5=1,就是1,2,3,4,5,6,7,9,10,11;

 

number = int(input())  # 砝码数量
arr = list(map(int, input().split()))
summ = sum(arr)
# 动态规划数组  dp[i][j]代表加入第i个砝码时,能不能称出重量j
dp = [[False for l in range(summ + 1)] for h in range(number + 1
<think>好的,我现在需要帮用户整理蓝桥杯Python组A组的常用代码模板、优化技巧和注意事项。首先,我应该先回想一下蓝桥杯的比赛特点,尤其是A组的难度通常较高,涉及算法和数据结构较多。 用户可能需要的代码模板包括基础算法,比如排序、二分查找、DFS、BFS、动态规划、贪心等。此外,优化技巧也很重要,比如输入输出加速、记忆化搜索、剪枝等。注意事项可能涉及Python的特性,如递归深度限制、列表性能等。 先考虑基础算法部分。排序算法中,快排和归并是常考的,但Python内置的sort函数已经优化得很好,可能只需要提醒用户使用sorted或list.sort()。二分查找的模板需要准确处理边界条件,比如左右区间的闭合情况。DFS和BFS的模板需要区分递归和队列的实现,以及如何避免重复访问。动态规划方面,背包问题、最长子序列等可能需要模板,同时注意状态转移方程的实现。贪心算法可能没有固定模板,但需要举例如区间调度或哈夫曼编码。 然后是优化技巧。输入输出方面,Python的input较慢,使用sys.stdin.readline会更快,尤其是在大量数据时。递归深度限制可能需要设置sys.setrecursionlimit,但要注意栈溢出。记忆化可以用lru_cache装饰器,但参数必须是不可变类型。循环优化方面,尽量减少循环内的操作,用列表推导或生成器表达式。空间优化,比如滚动数组,在DP中常见。预处理和剪枝在搜索问题中很重要,比如提前计算素数表或排列组合。 接下来是注意事项。Python的递归深度默认是1000,蓝桥杯的题目如果数据量大,可能会超过这个限制,需要调整。列表访问速度,尽量用索引而非pop(0)等操作,可以用deque代替列表实现队列。全局变量在递归中使用时需要注意是否需要nonlocal或global声明。浮点数精度问题,比较时使用相减取绝对值小于一个极小值。时间复杂度分析,Python本身较慢,需要选择更优算法,比如O(n^2)可能在n=1e4时超时,而O(n)或O(nlogn)更安全。 代码模板部分,每个算法给出示例。比如二分查找,给出左右闭合区间和循环结束条件。DFS用递归实现,BFS用队列。并查集的路径压缩和按秩合并。快速幂的递归和迭代版本。动态规划中的背包问题,01背包和完全背包的状态转移。图算法中的Dijkstra和Floyd,但Python可能需要用堆优化Dijkstra。 还要考虑Python的一些特性,比如lru_cache的使用,但递归层数多或者参数大时会占用内存,甚至变慢。在深搜时,如果节点数过多,递归可能栈溢出,需要改为迭代方式。 最后是总结部分,需要把这些内容分门别类,结构清晰,用代码块展示关键模板,同时提醒用户注意常见问题,如输入输出加速,递归深度等。可能还需要提醒测试用例的边界情况,比如n=0或1的时候,数组越界等问题。 在组织回答时,先分大类:常用代码模板、优化技巧、注意事项,每个大类下再分小点,每个小点给出代码示例和解释。确保代码符合LaTeX格式,行内公式用$...$,独立公式用$$...$$,但用户的问题中可能不需要太多数学公式,所以主要关注代码模板的展示,但如果有算法中的数学表达式,比如状态转移方程,需要正确格式化。 检查是否有遗漏的部分,比如图算法中的拓扑排序、最小生成树等,但可能A组更侧重动态规划和搜索。另外,数论相关的模板,如欧几里得算法、素数筛法,也可能需要包含。 最后确保所有建议符合Python的最佳实践,并且在蓝桥杯比赛环境下可行,比如某些库函数是否允许使用,但通常蓝桥杯允许使用标准库,所以sys、collections、heapq等是可以用的。</think>以下是针对蓝桥杯Python组(尤其是A组)的代码模板、优化技巧和注意事项整理,结合算法高频考点和Python语言特性: --- ### 一、常用代码模板 #### 1. **基础算法模板** - **二分查找** ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` - **快速排序(分治思想)** ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` - **DFS(深度优先搜索)** ```python def dfs(node, visited): if node in visited: return visited.add(node) for neighbor in graph[node]: dfs(neighbor, visited) ``` - **BFS(广度优先搜索)** ```python from collections import deque def bfs(start): queue = deque([start]) visited = set([start]) while queue: node = queue.popleft() for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) ``` --- #### 2. **动态规划模板** - **背包问题(01背包)** ```python def knapsack(weights, values, capacity): n = len(weights) dp = [0] * (capacity + 1) for i in range(n): for j in range(capacity, weights[i]-1, -1): dp[j] = max(dp[j], dp[j - weights[i]] + values[i]) return dp[capacity] ``` - **最长公共子序列(LCS)** ```python def lcs(text1, text2): m, n = len(text1), len(text2) dp = [[0]*(n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if text1[i-1] == text2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) return dp[m][n] ``` --- #### 3. **图论算法模板** - **Dijkstra最短路径(堆优化版)** ```python import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 heap = [(0, start)] while heap: current_dist, current_node = heapq.heappop(heap) if current_dist > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_dist + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) return distances ``` - **并查集(路径压缩+按秩合并)** ```python class UnionFind: def __init__(self, size): self.parent = list(range(size)) self.rank = [0] * size def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): root_x = self.find(x) root_y = self.find(y) if root_x == root_y: return if self.rank[root_x] < self.rank[root_y]: self.parent[root_x] = root_y else: self.parent[root_y] = root_x if self.rank[root_x] == self.rank[root_y]: self.rank[root_x] += 1 ``` --- ### 二、优化技巧 1. **输入输出加速** ```python import sys input = sys.stdin.readline # 读取大量数据时效率提升明显 ``` 2. **记忆化搜索** ```python from functools import lru_cache @lru_cache(maxsize=None) def dfs(params): # 递归函数体 ``` 3. **空间换时间** - 预处理素数表、阶乘表等(例如欧拉筛法)。 4. **循环优化** - 避免多层嵌套循环,优先使用生成器或内置函数(如`itertools`)。 --- ### 三、注意事项 1. **递归深度限制** Python默认递归深度为1000,若题目需要深递归(如DFS树遍历),需手动扩展: ```python import sys sys.setrecursionlimit(100000) ``` 2. **列表性能问题** - 避免频繁使用`pop(0)`(复杂度$O(n)$),改用`collections.deque`。 3. **全局变量与局部变量** 在递归函数中修改全局变量时需用`global`声明,闭包中需用`nonlocal`。 4. **浮点数精度** 比较浮点数时用误差判断: ```python if abs(a - b) < 1e-6: # 而非直接 a == b ``` 5. **时间复杂度估算** Python每秒约处理$10^6$次操作,若数据规模$n=10^5$,需选择$O(n)$或$O(n \log n)$算法。 --- ### 四、总结 蓝桥杯A组题目常考动态规划、图论、搜索与数学题,建议: 1. **熟记模板**:如Dijkstra、并查集、背包问题等。 2. **针对性刷题**:重点练习历年真题(如砝码称重、括号序列等)。 3. **实战模拟**:限时训练,适应比赛节奏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值