来到第六天,开始了一块新内容:完全背包
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。01背包和完全背包不同就是体现在遍历顺序上。
- # 先遍历物品,再遍历背包
- 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()
-
-
- # 先遍历背包,再遍历物品
- def test_CompletePack():
- weight = [1, 3, 4]
- value = [15, 20, 30]
- bagWeight = 4
-
- dp = [0] * (bagWeight + 1)
-
- for j in range(bagWeight + 1): # 遍历背包容量
- for i in range(len(weight)): # 遍历物品
- if j - weight[i] >= 0:
- dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
-
- print(dp[bagWeight])
-
- test_CompletePack()
You are given an integer array
coinsrepresenting coins of different denominations and an integeramountrepresenting a total amount of money.Return the number of combinations that make up that amount. If that amount of money cannot be made up by any combination of the coins, return
0.You may assume that you have an infinite number of each kind of coin.
The answer is guaranteed to fit into a signed 32-bit integer.
动规五部曲:
- class Solution:
- def change(self, amount: int, coins: List[int]) -> int:
- dp = [0]*(amount + 1)
- dp[0] = 1
- for i in range(len(coins)):
- for j in range(coins[i], amount + 1):
- dp[j] += dp[j - coins[i]]
- return dp[amount]
Given an array of distinct integers
numsand a target integertarget, return the number of possible combinations that add up totarget.The test cases are generated so that the answer can fit in a 32-bit integer.
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!
所以本题遍历顺序最终遍历顺序:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前到后遍历。
- class Solution:
- def combinationSum4(self, nums: List[int], target: int) -> int:
- dp = [0] * (target + 1)
- dp[0] = 1
- for i in range(1, target + 1):
- for j in range(len(nums)):
- if i - nums[j] >= 0:
- dp[i] += dp[i - nums[j]]
- return dp[target]