01背包问题,你该了解这些!
0-1背包 n种物品,每种物品仅有一个
完全背包:n种物品 每种物品有无限个
多重背包:n种物品 每种物品的个数各不相同
416. 分割等和子集
这里元素不能重复使用
这里重量和价值相同,都用nums[i]表示
if dp[target]==target: return True
else:return False
#一维背包
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if sum(nums)%2!=0:
return False
target=sum(nums)//2
dp=[0]*(target+1)
for i in range(1,len(nums)):
for j in range(target,nums[i]-1,-1):
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])
if dp[target]==target:
return True
else:
return False
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if sum(nums)%2!=0:
return False
target=sum(nums)//2
dp=[[0]*(target+1) for _ in range(len(nums))]
#二维dp数组
#初始化
for j in range(nums[0],target+1):
dp[0][j]=nums[0]
for i in range(1,len(nums)):
for j in range(target+1):
if j<nums[i]:
dp[i][j]=dp[i-1][j]
else:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i])
if dp[len(nums)-1][target]==target:
return True
else:
return False