为什么迭代循环的顺序在这里很重要?
def change1(self, amount, coins):
"""
:type amount: int
:type coins: List[int]
:rtype: int
"""
if amount == 0:
return 1
dp = [0 for _ in range(amount + 1)]
dp[0] = 1
# dp[i] to denote the number of ways to sum up to amount i.
for j in range(len(coins)): # switch those 2 statements would be wrong answer why???
for i in range(1, amount + 1):
if i - coins[j] >= 0:
dp[i] += dp[i - coins[j]]
return dp[amount]
def change2(amount, coins): # wrong answer
"""
:type amount: int
:type coins: List[int]
:rtype: int
"""
if amount == 0:
return 1
dp = [0 for _ in range(amount + 1)]
## when amount is 0, # combinations is 1
dp[0] = 1
# dp[i] to denote the number of ways to sum up to amount i.
for i in range(1, amount + 1):
for j in range(len(coins)): # switch those 2 statements would be wrong answer why???
if i - coins[j] >= 0:
dp[i] += dp[i - coins[j]]
return dp[amount]
变更 1
dp[i-1] = dp[i-1-c2] + dp[i-1-c2] + dp[i-2-c2] + ..dp[0]
dp[i] = dp[i-c1] + dp[i-1-c1] + dp[i-2-c1] + ...dp[0]
这是正确的解决方案。
变更 2
dp[i-1] = dp[i-1-c1] + dp[i-1-c2] + dp[i-1-c3] + dp[i-1-c4] + ... dp[0]
dp[i] = dp[i-c1] + dp[i-c2] + dp[i-c3] + dp[i-c4] + ... dp[0]
为什么这个方法是错误的?
总量i可以从取硬币c1或c2或c3的选择之和中导出,这在我看来更加直观。
我已经查了一些参考资料,但没有找到令人满意的答案。
编辑:我也理解改变嵌套循环的顺序会得到错误的答案,我正在努力理解为什么第二种方法有错误的直觉而第一种方法是正确的。
dp[i][j]
,而是用dp[amount]
表示总和为 i 的方法数。根据定义,它应该是dp[amount] = dp[amount-c1] + dp[amount-c2] ...
。 - undefineddp[i][j]
。如果你仔细观察,你会发现在dp[n][amount]
上定义的dp
状态等同于dp[amount]
,在每次迭代中,不是更新原始的dp
数组,而是为每次迭代创建一个新的行。 - undefineddp[amount]
表示方法总数也没有问题,它表示使用任何硬币凑出总金额的方法数。 - undefined