碎碎念:加油!!
参考:
几类背包的区别:
0-1背包的每种物品只有一个
完全背包的每种物品有无限个
多重背包的每种物品的个数各不相同
当前层是由上一层推导来的,所以可以直接把上一层拷贝 到当前层,然后直接在当前层进行计算,把新的值覆盖到当前层中。
用一维dp数组实现01背包-动态规划五部曲:
动态规划五部曲:
// cpp
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % 2 == 1) return false;
int target = sum / 2;
vector<int> dp(10001, 0);
for (int i = 0; i < nums.size(); i++) {
for (int j = target; j >= nums[i]; j--) {
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
if (dp[target] == target) return true;
return false;
}
};
# python
class Solution:
def canPartition(self, nums: List[int]) -> bool:
_sum = 0
dp = [0] * 10001
for num in nums:
_sum += num
if _sum % 2 == 1:
return False
target = _sum // 2
for num in nums:
for j in range(target, num - 1, -1):
dp[j] = max(dp[j], dp[j-num] + num)
if dp[target] == target:
return True
return False
注意遍历物品和背包的顺序,注意遍历背包的时候要倒序遍历,防止重复使用同一个数字。