力扣上没有纯粹的完全背包的题目,所以大家看本篇了解一下 完全背包的理论
后面的两道题目,都是完全背包的应用,做做感受一下
完全背包
518. 零钱兑换 II
视频讲解:动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili
Python:
518和377两个题适合一起品一品,两层forloop的顺序对于结果是由影响的,如果先遍历物品后遍历背包,结果是组合,即518题;反之,如果先遍历背包后遍历物品,结果是排列,即377题。
python
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, 1):
dp[j] += dp[j-coin]
return dp[amount]
C++:
cpp
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount+1, 0);
dp[0] = 1;
for (int c : coins) {
for (int j=c; j<=amount; j++) {
dp[j] += dp[j-c];
}
}
return dp[amount];
}
};
377. 组合总和 Ⅳ
视频讲解:动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili
Python:
python
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0] * (target+1)
dp[0] = 1
for j in range(1, target+1):
for num in nums:
if num>j: continue
dp[j] += dp[j-num]
return dp[target]
C++:
C++要注意处理加法溢出的情况。
cpp
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1, 0);
dp[0] = 1;
for (int j=1; j<=target; j++) {
for (int num:nums) {
if (num > j || dp[j]>=INT_MAX-dp[j-num]) continue;
dp[j] += dp[j-num];
}
}
return dp[target];
}
};