Python代码:简化网友国度货币系统,求解最小货币种数
以下是解决该问题的Python代码: ```python # 读取数据组数 T = int(input()) for _ in range(T): # 读取货币种数 n = int(input()) # 读取面额数组 coins = list(map(int, input().split())) # 对面额数组进行排序 coins.sort() max_amount = coins[-1] # 初始化动态规划数组 dp = [False] * (max_amount + 1) dp[0] = True # 用于记录最终保留的货币数量 ans = 0 for coin in coins: # 如果当前面额不能由之前的面额组合得到,则保留该面额 if not dp[coin]: ans += 1 # 更新动态规划数组 for j in range(coin, max_amount + 1): dp[j] = dp[j] or dp[j - coin] print(ans) ``` 代码解释: 1. 读取输入:首先读取数据的组数`T`,然后对于每组数据,读取货币种数`n`和面额数组`coins`。 2. 排序面额数组:对面额数组进行排序,方便后续处理。 3. 初始化动态规划数组:创建一个长度为`max_amount + 1`的布尔型数组`dp`,其中`dp[i]`表示金额`i`是否可以被表示出来。初始时,`dp[0]`为`True`,因为金额0可以不使用任何货币表示。 4. 遍历面额数组:对于每个面额`coin`,如果`dp[coin]`为`False`,说明该面额不能由之前的面额组合得到,因此保留该面额,并更新动态规划数组。 5. 更新动态规划数组:对于每个可以使用当前面额`coin`表示的金额`j`,更新`dp[j]`为`dp[j] or dp[j - coin]`。 6. 输出结果:最后输出保留的货币数量`ans`。 复杂度分析: - 时间复杂度:$O(T * n * max_amount)$,其中$T$是数据组数,$n$是货币种数,$max_amount$是最大面额。 - 空间复杂度:$O(max_amount)$,主要用于存储动态规划数组。 ######[AI问答 | 529点数解答 | 2025-12-13 10:29:25]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)458
- 精简C++代码:优化质数判断与输入累加流程!(阿里通义 | 213点数解答 | 2025-10-17 20:37:44)57
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)414
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)405
- 旅行售货员问题:详细步骤剖析与贪心算法Python代码实现(字节豆包 | 444点数解答 | 2024-12-17 03:32:59)275
- Dev C++ 实现旅行售货员问题:最小路程路线代码与详细解析 (字节豆包 | 448点数解答 | 2024-12-17 03:33:42)176
- C++ 求解 P1020 小核桃与删除字符串问题:双指针与枚举策略 (字节豆包 | 330点数解答 | 2026-02-07 18:40:10)23
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)389
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)414
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)526
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)389
- 深度剖析:黑盒、白盒、单元、集成、系统与验收测试的区别与联系 (百度文心 | 424点数解答 | 2023-11-09 18:24:11)299