完全背包
区别于01背包: 物品可以重复放入
01背包和完全背包唯一不同就是体现在遍历顺序上:
完全背包遍历背包容量是从小到大遍历的,因为物品可以添加多次
01背包一维dp一定是先遍历物品,再遍历背包容量
在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的
518. 零钱兑换 II
容易求成排列数
假设:coins[0] = 1,coins[1] = 5。
那么就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况。
def change(self, amount: int, coins: List[int]) -> int:
dp = [0] * (amount+1)
dp[0] = 1
for j in range(len(coins)):
for i in range(coins[j],amount+1):
dp[i] += dp[i-coins[j]]
# print(dp)
return dp[-1]
377. 组合总和 Ⅳ
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0] * (target+1)
for j in range(len(nums)):
if nums[j] > target:
continue
dp[nums[j]] += 1
for i in range(1,target+1):
for j in range(len(nums)):
if i >= nums[j]:
# 排列数
dp[i] += dp[i-nums[j]]
# print(dp)
return dp[-1]