题目描述:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
解题思路:转化为背包问题,代码如下
class Solution:
def canPartition(self, nums: List[int]) -> bool:
total = sum(nums)
size = len(nums)
if size <= 1: return False
if total % 2: return False
target = total // 2
dp = [[False] * (target+1) for _ in range(size)]
if nums[0] <= target:
dp[0][nums[0]] = True
else:
return False
for i in range(1, size):
for j in range(target+1):
if nums[i] == j:
dp[i][j] = True
continue
if nums[i] < j:
dp[i][j] = dp[i-1][j] | dp[i-1][j-nums[i]]
return dp[-1][-1]