関連するサブ問題の重複を考慮します。つまり、現在の金額に到達するための最適な方法は、
動的プログラミングを使用して到達する最適な方法(現在の金額-各コインの額面金額よりも少ない)に関連しています。
dp [i]は、iを作成するための最小のコイン数の方法です
。dp[i] = min(dp [i-coins [1]]、dp [i-coins [2]]、…、dp [i-coins [j ]])
ここで、coinsは昇順のリストで、coins [j]は額面がiより小さい最大の額面コインです。
class Solution:
def __init__(self):
self.adict = {0:0}
def coinChange(self, coins: List[int], amount: int) -> int:
types = len(coins)
if coins == []:
return -1
elif types == 1:
if amount % coins[0] == 0:
return int(amount / coins[0])
else:
return -1
for i in range(1,amount+1):#value in coins:
if i in coins:
self.adict[i] = 1
else:
self.adict[i] = -1
for i in range(1,amount+1):#对每一种可能的钱数
if i not in coins:#对非正好硬币面值的数字
for j in coins:#对每一种面值的硬币
if i >= j and self.adict[i-j] != -1:#若当前数字>=当前面值 且 当前数字-当前面值后 可以达到
if self.adict[i] == -1 or self.adict[i] > (1+self.adict[i-j]) :#若此时 这个数字还是不可达到 或者 出现更优解法
self.adict[i] = (1+self.adict[i-j])
print(i,self.adict[i])
#self.coins = sorted(coins)#coins
#print(self.coins)
return self.adict[amount]#int(self.dp(amount))