详细布置
力扣上没有纯粹的完全背包的题目,所以大家看本篇了解一下 完全背包的理论
后面的两道题目,都是完全背包的应用,做做感受一下
完全背包
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()
总结
感觉01背包和完全背包在代码上的区别只有遍历背包时用正序遍历,且完全背包可以先遍历背包再遍历物品。之所以可以这么做,因为它可以通过横向推出来,也可以通过纵向推出来。
518. 零钱兑换 II
视频讲解:动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili
class Solution(object):
def change(self, amount, 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]
总结
秒了。不过虽然是秒了,但感觉靠了点运气试出来的,之前我用的是max()函数来求的。求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]]。
377. 组合总和 Ⅳ
视频讲解:动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili
思路
开始我想这不和上题是一样的吗?但是看了看还是有区别,他加了个排列的问题,搞得我不会了。我想应该要改遍历或是方程式,但也不知道怎么改。
class Solution(object):
def combinationSum4(self, nums, target):
dp=[0]*(target+1)
dp[0]=1
for j in range(1,target+1):
for num in nums:
if j>=num:
dp[j]+=dp[j-num]
return dp[target]
总结
这道题遍历顺序和方程式都要改,把背包放上面可以让3出现在1的前面,而背包放下面的话只有先出现1后才会出现3。后面又把从num出发改成1为起点遍历,让每一个背包都可以添加所有的物品,从而实现排列。而j>=num可以不报错和节省时间。