有 n个正整数的非空数组 nums,判断是否可以从数组中选出一些数字,使得这些数字的和等于整个数组的元素和的一半。若可行则输出true,否则输出false。
时间: 2024-09-15 07:14:31 浏览: 34
这个问题是一个经典的求解“子集和”问题,通常可以用动态规划的方法解决。我们可以创建一个名为dp的布尔数组,其中dp[i]表示前i个数字是否存在一种组合,其和等于nums数组总和的一半。初始时,dp[0]为true,因为没有元素时任何数都是总和的一半。
对于每个数字nums[i],我们有两个选项:包含它或不包含它。如果包含它,那么我们需要找到剩余元素和为总和减去nums[i]的一半的组合,这对应于dp[nums_sum - nums[i]];如果不包含它,我们就需要找到剩余元素和等于总和的一半的组合,这对应于dp[nums_sum / 2]。
最终,如果dp[nums_sum / 2]为true,说明存在这样的组合,返回true;否则返回false。
以下是伪代码形式:
```python
def canPartition(nums):
total_sum = sum(nums)
target_sum = total_sum / 2
dp = [False] * (target_sum + 1)
dp[0] = True
for num in nums:
for i in range(num, target_sum + 1): # 从当前数开始覆盖到目标区间
dp[i] |= dp[i - num]
return dp[target_sum]
# 示例
nums = [1, 7, 11, 5]
result = canPartition(nums)
if result:
print(True) # 可行,返回true
else:
print(False)
阅读全文