完全背包
核心代码
// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品
for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
完全背包代码
先遍历物品,再遍历背包
def test_CompletePack():
weight = [1, 3, 4]
value = [15, 20, 30]
bagWeight = 4
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(weight[i], bagWeight + 1): # 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bagWeight])
test_CompletePack()
先遍历背包,再遍历物品
def test_CompletePack():
weight = [1, 3, 4]
value = [15, 20, 30]
bagWeight = 4
dp = [0] * (bagWeight + 1)
for j in range(bagWeight + 1): # 遍历背包容量
for i in range(len(weight)): # 遍历物品
if j - weight[i] >= 0:
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bagWeight])
test_CompletePack()
518.零钱兑换II
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
n = len(coins)
dp = [[0]*(amount+1) for _ in range(n+1)] # 初始化
dp[0][0] = 1
# 状态更新
for i in range(1,n+1):
for j in range(amount+1):
if j <coins[i-1]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = dp[i-1][j]+dp[i][j-coins[i-1]]
return dp[n][amount]
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
n = len(coins)
dp = [0]*(amount+1) # 初始化
dp[0] = 1
# 状态更新
for coin in coins:
for j in range(coin,amount+1):
dp[j] += dp[j-coin]
return dp[amount]
时间复杂度:O(n*amount)
空间复杂度:O(amount)
377.组合总和IV
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
if not nums:
return 0
dp = [0]*(target+1)
dp[0] = 1
# 考虑元素之间的顺序则需要这样循环
for i in range(1,target+1):
for num in nums:
if i >= num:
dp[i]+=dp[i-num]
return dp[target]