题目链接
题目描述
给定一个非空的正整数数组 nums ,请判断能否将这些数字分成元素和相等的两部分。
示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:nums 可以分割成 [1, 5, 5] 和 [11] 。
示例 2:输入:nums = [1,2,3,5]
输出:false
解释:nums 不可以分为和相等的两部分
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
解题思路
代码
Python
class Solution:
def canPartition(self, nums: list[int]) -> bool:
S = sum(nums)
if S & 1:
return False
target = S >> 1
if max(nums) > target:
return False
'''【0/1背包】:从nums中选出的数字刚好能组成target'''
n = len(nums)
# 初始化
dp = [[False] * (target + 1) for _ in range(n + 1)]
# dp[i][j]: 从前i个元素中选出若干个数字刚好能够组成j
dp[0][0] = True # 其他 dp[0][j]均为False
for i in range(1, n + 1):
for j in range(target + 1):
if j < nums[i - 1]: # 容量有限,无法选择第i个数字nums[i-1]
dp[i][j] = dp[i - 1][j]
else: # 可选择第i个数字nums[i-1],也可不选
dp[i][j] = dp[i - 1][j] | dp[i - 1][j - nums[i - 1]]
return dp[n][target]