2017-11-25 10 views
0

これはPythonの最小限の変更の問題を解決するためのダイナミックプログラミングソリューションですBryce Boeです。私は一般的なelifブロックで何が起こっているのか分かりません。具体的には、この行で[:]は何をしていますか?この行の[:]は何ですか?

table[i] = table[i - coin][:] 

これはテーブルメモリストの代わりに辞書で記述できますか?

def solve_coin_change(coins, value): 
    """A dynamic solution to the coin change problem""" 

    table = [None for x in range(value + 1)] 
    table[0] = [] 
    for i in range(1, value + 1): 
     for coin in coins: 
      if coin > i: 
       continue 
      elif not table[i] or len(table[i - coin]) + 1 < len(table[i]): 
       if table[i - coin] != None: 
        table[i] = table[i - coin][:] 
        table[i].append(coin) 

    if table[-1] != None: 
     print('%d coins: %s' % (len(table[-1]), table[-1])) 
    else: 
     print('No solution possible') 

coins = [1, 2, 4] 
value = 11 

solve_coin_change(coins, value) 

答えて

3

この行は、エイリアスではなく、リストtable[i - coin]のコピーを作成しています。それはslice表記を使用しています。

table[i] = table[i - coin][:] 

各要素は、table[i]独立オブジェクトを作成する代わりに、table[i - coin]に新しいラベルを割り当てる、コピーされます。あなたがtable[i - coin]、またはtable[i]のいずれかを別のものと独立して変更できる場合は、i/e。

+2

深いコピーではなく、浅いコピーです。 – chepner

+0

はい、ありがとうございました@chepner –

2

これは、リストのスライス表記です。この場合、参照を使用する代わりに、table [i-coin]のコピーを作成するために使用されています。

関連する問題