第九章 动态规划(四)
主要内容
0-1背包
二维
def test_2d_bag_problem():
bagweight = 4
weight = [1, 3, 4]
value = [15, 20, 30]
n = len(weight)
# 二维数组
dp = [[0] * (bagweight + 1) for _ in range(n)]
# 初始化
for i in range(n):
if i >= weight[0]:
dp[0][i] = value[0]
# 递推, for循环可交换
for i in range(1, n):
for j in range(1, bagweight + 1):
if j < weight[i]:
# 不放入第i个物品
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
return dp[n - 1][bagweight]
def test_1d_bag_problem():
bagweight = 4
weight = [1, 3, 4]
value = [15, 20, 30]
n = len(weight)
# 一维数组
dp = [0] * (bagweight + 1)
# 初始化
# dp[0] = 0
# 遍历
for i in range(n):
# 为了保证物品只取一次,需要倒序遍历
for j in range(bagweight, weight[i]-1, -1):
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
# print(dp)
return dp[-1]
题目
416. 分割等和子集
思路分析
代码
class Solution:
def canPartition(self, nums: List[int]) -> bool:
n = len(nums)
s = sum(nums)
if n == 1 or s % 2 == 1:
return False
# 挑选元素 使得其和为 s/2
# 包的容量为s/2
bagweight = s // 2
# 对于元素来说 w == v
dp = [0] * (bagweight + 1)
for i in range(n):
for j in range(bagweight, nums[i] - 1, -1):
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
return dp[-1] == bagweight