Minimizing Coins 题解

Minimizing Coins(最少硬币数)

题目描述

https://cses.fi/problemset/task/1634/

给定 n 种硬币,每种硬币价值为 ci,求凑成金额 x 所需的最少硬币数(每种硬币可用无限次)。如果无法凑成,输出 -1。

限制: - 1 ≤ n ≤ 100 - 1 ≤ x ≤ 106 - 1 ≤ c_i ≤ 106


解法

问题类型:完全背包

定义dp[j] 为凑成金额 j 所需的最少硬币数

初始条件dp[0] = 0(金额 0 需要 0 个硬币),其他初始化为 INF

状态转移dp[j] = min (dp[j − ci] + 1)  for all i

解释:遍历每种硬币,尝试将硬币加到已有金额上。如果金额 i 可以用 dp[i] 个硬币凑成,那么金额 i + coin 可以用 dp[i] + 1 个硬币凑成,取所有方案中的最小值。

代码

INF = 10 ** 18
n, x = map(int, input().split())
coins = list(map(int, input().split()))

dp = [INF] * (x + 1)
dp[0] = 0

for c in coins:
    for i in range(c, x + 1):
        dp[i] = min(dp[i], dp[i - c] + 1)

print(dp[x] if dp[x] != INF else -1)

时间复杂度:O(n × x) 空间复杂度:O(x)


Minimizing Coins 题解
https://mingsm17518.github.io/2026/04/08/algorithm/03_Gold/02_动态规划/完全背包/03_Minimizing Coins/
作者
Ming
发布于
2026年4月8日
许可协议