1049. 最后一块石头的重量 II
5//2=2
向下取整,所以sum(stones)-dp[target]一定比dp[target]大,不用再去abs了
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
target=sum(stones)//2
dp=[0]*(target+1)
for i in range(len(stones)):
for j in range(target,stones[i]-1,-1):
dp[j]=max(dp[j],dp[j-stones[i]]+stones[i])
return abs(dp[target]-(sum(stones)-dp[target]))
494. 目标和
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
#dp[j]:装满容量为j的背包,有dp[j]种方法
if (sum(nums)+target)%2!=0:
return 0
elif abs(target)>sum(nums):
return 0
else:
left=(sum(nums)+target)//2
dp=[0]*(left+1)
dp[0]=1
for i in range(len(nums)):
for j in range(left,nums[i]-1,-1):
dp[j]+=dp[j-nums[i]]
return dp[left]
474.一和零
class Solution:
def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
#dp[i][j]表示i个0,j个1 最大背dp[i][j]个物品 dp[m][n]即为最后所求
dp=[[0]*(n+1) for _ in range(m+1)]
for s in strs:
ones=s.count('1')
zeros=s.count('0')
for i in range(m,zeros-1,-1):
for j in range(n,ones-1,-1):
dp[i][j]=max(dp[i][j],dp[i-zeros][j-ones]+1)
return dp[m][n]