赞
踩
完全背包相对于01背包来说物品有无限个
代码的不同主要体现在遍历顺序上, 完全背包的背包重量不需要倒序遍历,因为物品有无限个,可以被无限添加;并且因为背包重量正序遍历,后续的值依赖于前面的值,因此背包和物品的内外层遍历也没有特定顺序
下面以物品外层循环,背包容量内层循环为例
- def test_CompletePack(weight, value, bagWeight):
- 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])
- return dp[bagWeight]
-
- if __name__ == "__main__":
- weight = [1, 3, 4]
- value = [15, 20, 30]
- bagWeight = 4
- result = test_CompletePack(weight, value, bagWeight)
- print(result)
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
动态规划五部曲:
- class Solution:
- def change(self, amount: int, coins: List[int]) -> int:
- 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]
- class Solution:
- def combinationSum4(self, nums: List[int], target: int) -> int:
- dp = [0] * (target + 1)
- dp[0] = 1
- for j in range(target + 1):
- for num in nums:
- if j >= num:
- dp[j] += dp[j-num]
- return dp[target]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。