Merge pull request #1881 from Logenleedev/my-contribution

优化 - 零钱找零
This commit is contained in:
程序员Carl
2023-02-04 09:43:43 +08:00
committed by GitHub
3 changed files with 6 additions and 6 deletions

View File

@ -120,7 +120,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
大家可以看到红色框为最后两次卖出的状态。
现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。
现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。如果想不明白的录友也可以这么理解如果第一次卖出已经是最大值了那么我们可以在当天立刻买入再立刻卖出。所以dp[4][4]已经包含了dp[4][2]的情况。也就是说第二次卖出手里所剩的钱一定是最多的。
所以最终最大利润是dp[4][4]

View File

@ -209,19 +209,19 @@ class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
'''版本一'''
# 初始化
dp = [amount + 1]*(amount + 1)
dp = [float("inf")]*(amount + 1)
dp[0] = 0
# 遍历物品
for coin in coins:
# 遍历背包
for j in range(coin, amount + 1):
dp[j] = min(dp[j], dp[j - coin] + 1)
return dp[amount] if dp[amount] < amount + 1 else -1
return dp[amount] if dp[amount] != float("inf") else -1
def coinChange1(self, coins: List[int], amount: int) -> int:
'''版本二'''
# 初始化
dp = [amount + 1]*(amount + 1)
dp = [float("inf")]*(amount + 1)
dp[0] = 0
# 遍历物品
for j in range(1, amount + 1):
@ -229,7 +229,7 @@ class Solution:
for coin in coins:
if j >= coin:
dp[j] = min(dp[j], dp[j - coin] + 1)
return dp[amount] if dp[amount] < amount + 1 else -1
return dp[amount] if dp[amount] != float("inf") else -1
```

View File

@ -139,7 +139,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15
倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。
(这里如果读不懂,就回想一下dp[j]的定义或者就把两个for循环顺序颠倒一下试试
(这里如果读不懂,就回想一下dp[j]的定义或者就把两个for循环顺序颠倒一下试试
**所以一维dp数组的背包在遍历顺序上和二维其实是有很大差异的**,这一点大家一定要注意。