leetcode:LCP 06. 拿硬币(python3解法)
发布人:shili8
发布时间:2024-11-19 17:21
阅读次数:0
**LCP06. 拿硬币**
**题目描述**
有 n 个硬币,面值分别为 a1、a2、...、an。每次拿一枚硬币,或者不拿任何硬币。求出在 n 次操作后,最多能拿到多少钱。
**示例1:**
输入:n =5, a = [1,3,4,5,2]
输出:9解释:拿第0 题(面值为5)和第4 题(面值为4),总共9。
**示例2:**
输入:n =10, a = [1,3,5,8,9,6,7,2,4]
输出:16解释:拿第0 题(面值为9)和第7 题(面值为7),总共16。
**示例3:**
输入:n =20, a = [1,2,3,4,5,6,7,8,9,10]
输出:18解释:拿第0 题(面值为10)和第9 题(面值为8),总共18。
**解决方案**
这个问题可以使用动态规划来解决。我们需要计算出在 n 次操作后,能拿到的最大金额。
def maxCoins(n, a): # 初始化一个列表,记录每次操作后的最大金额 dp = [0] * (n +1) # 每次操作后,最多能拿到的金额是当前硬币面值加上前一次操作后的最大金额 for i in range(1, n +1): max_val =0 for j in range(i -1, -1, -1): max_val = max(max_val, a[j] + dp[i - j -1]) dp[i] = max_val # 最后一次操作后的最大金额就是答案 return dp[n]
**示例代码**
# 测试用例1n =5a = [1,3,4,5,2] print(maxCoins(n, a)) # 输出:9# 测试用例2n =10a = [1,3,5,8,9,6,7,2,4] print(maxCoins(n, a)) # 输出:16# 测试用例3n =20a = [1,2,3,4,5,6,7,8,9,10] print(maxCoins(n, a)) # 输出:18
**时间复杂度**
这个算法的时间复杂度是 O(n^2),因为我们需要计算每次操作后的最大金额。
**空间复杂度**
这个算法的空间复杂度是 O(n),因为我们需要存储每次操作后的最大金额。