Leetcodeブラシ質問レコード322-変更の変更

ここに画像の説明を挿入

関連するサブ問題の重複を考慮します。つまり、現在の金額に到達するための最適な方法は、
動的プログラミングを使用して到達する最適な方法(現在の金額-各コインの額面金額よりも少ない)に関連しています。

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))
43件の元の記事を公開 14 件を賞賛・2 万回以上の閲覧

おすすめ

転載: blog.csdn.net/weixin_41545780/article/details/105085435