今天的题都是完全背包的题.0-1背包指的是dp[i]代表不重复的装物品,装到第重量为i时的最大的价值总和.完全背包定义相似,不同点在于物品是可以重复放的
0-1背包的遍历顺序是物品遍历前序target遍历后续.而完全背包则全是前序遍历
518. Coin Change II
这道题dp[i]代表的是acmount到i为止能有多少种装法(没有顺序).那么 dp[i]+=dp[i-coin],初始化dp[0]=1因为至少有一种方法.这里因为不是求最值而是方法数.这道题是求有多少种组合并不是排列,所以要先遍历物品然后遍历target
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp=[0 for _ in range(amount+1)]
dp[0]=1
for c in coins:
for i in range(c,amount+1):
dp[i]+=dp[i-c]
return dp[-1]
377. Combination Sum IV
这道题和上一道题相似,只是因为求的是排列,所以是有顺序的,那么要先遍历target然后再遍历物品.初值还是dp[0]=1
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp=[0 for _ in range(target+1)]
dp[0]=1
for j in range(1,target+1):
for n in nums:
if j-n>=0:
dp[j]+=dp[j-n]
return dp[-1]