Day 44 | 动态规划 06

66 阅读1分钟

完全背包

区别于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]