给定n种硬币,第i种硬币的面值为coins[i-1],目标金额为amt,每种硬币可以重复选取,求能够凑出目标金额的最少硬币数量;如果不能凑出目标金额,返回-1。对应代码如下:
def coinChangeDPComp(coins: list[int], amt: int) -> int:
n = len(coins)
MAX = amt + 1
dp = [MAX] * (amt + 1)
dp[0] = 0
for i in range(1, n + 1):
for a in range(1, amt + 1):
if coins[i - 1] > a:
dp[a] = dp[a]
else:
dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)
return dp[amt] if dp[amt] != MAX else -1