步骤一、确定状态:
确定dp数组及含义
由于这是个0-1背包问题, dp用一维数组, 大小是sum/2+1就好
步骤二、推断状态方程:
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])
步骤三、规定初始条件:
初始条件:
全局初始化, 由于都是正整数,所以可以都初始化0, 而dp数组初始化的话,dp[0] = 0
步骤四、计算顺序:
这个和0-1背包的一致, 先对每个物品(数组的元素)正向遍历, 然后对于每个 容量的背包逆向遍历
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if sum(nums) % 2 == 1:
return False
bag_size = sum(nums)//2 # 背包容量
dp = [0] * (bag_size + 1)
dp[0] = 0 # 初始化
for i in range(len(nums)): # 遍历物品
for j in range(bag_size, nums[i]-1, -1): # 遍历背包容量
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])
if dp[bag_size] == bag_size: # 正好装下
return True
return False