总结
初次见面,非常惨败
416. 分割等和子集
题目链接:
自己想
1.自己连taget = sum/2这步都没想到
2.
- 练习一下回溯暴力解法
看完题解
1.首先明确,背包的总体积为sum/2,
2.背包的质量和价值就是nums数组中的本身值
3.元素只有两种状态,放或者不放
因此,可以用背包问题解决,dp[j]表示当和为i时,实际数组求和的值为dp[j]
完整代码
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if sum(nums)%2 != 0 or len(nums) == 1:
return False
print(nums)
n = int(sum(nums)/2)
dp = [0] * (n+1)
print(dp)
for num in nums:
for j in range(n,num-1,-1):
dp[j] = max(dp[j],dp[j-num]+num)
if dp[n] == n:
return True
else: return False
暴力回溯代码:
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if sum(nums)%2 != 0 or len(nums) == 1:
return False
n = int(sum(nums)/2)
# dp = [0] * (n+1)
# print(dp)
# for num in nums:
# for j in range(n,num-1,-1):
# dp[j] = max(dp[j],dp[j-num]+num)
# if dp[n] == n:
# return True
# else: return False
nums.sort()#先对nums排序
print(nums)
path = []
result = []
def backtracking(startindex,path):
if sum(path) == n:
result.append(path[:])
return True
for i in range(startindex,len(nums)):
# print(i)
path.append(nums[i])
# print(path)
a = backtracking(i+1,path)
path.pop()
backtracking(0,path)
if len(result) > 0:
return True
else:
return False