0-1背包问题,动态规划
首先明确dp[i][j]的定义:
[0:i]范围内选取一定的数nums[x]可以使这些数的和为j
所以base case:
如果不选取任何正整数,则被选取的正整数等于 0。因此对于所有 0≤i<n,都有 dp[i][0]=true。
因为j的范围是[0,m],所以是m+1个数,n直接对应数组下标[0,n-1], 所以当dp[0][x]就是选择第一个下标为0的数
dp[0][nums[0]] = 1
def canPartition(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
target = sum(nums)
m = target//2
if target%2 != 0:
return False
dp = [[False]*(m+1) for i in range(n)]
dp[0][0] = True
if nums[0] < m+1:
dp[0][nums[0]] = True
for i in range(1,n):
for j in range(m+1):
dp[i][j] = dp[i-1][j]
if nums[i] < j:
dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i]]
return dp[n-1][m]