1049. 最后一块石头的重量 II
解题思路:动规
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
total = sum(stones)
#将石头分成两堆差不多大小的,尽可能大得取到其中一堆,这样可以有尽可能小的重量返回
target = total // 2
dp = [0] *(target+1)
for i in range(len(stones)):
for j in range(target,stones[i]-1,-1):
print(dp)
dp[j] = max(dp[j],dp[j-stones[i]] + stones[i])
return (total - dp[target]) - dp[target]
494. 目标和
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
#dp[j] 装满容量为j的背包有dp[j]种方法
# nums:物品重量
total = sum(nums)
if abs(target) > total or (total + target) % 2 != 0: return 0
# 背包容量
total += target
bag_size = total // 2
dp = [0] * (bag_size+1)
dp[0] = 1
for i in range(len(nums)):
for j in range(bag_size,nums[i]-1,-1):
# print(dp)
dp[j] += dp[j-nums[i]]
return dp[-1]
474.一和零
class Solution:
def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
#dp[i][j]:装满i个0,j个1最多能装dp[i][j]个物品
#背包重量有两个维度,m个0 和 n个1
#物品重量:x个0,y个1
#初始化
dp = [[0]*(n+1) for _ in range(m+1)]
#物品遍历
for num in strs:
x = num.count('0')
y = num.count('1')
#背包二维遍历
for i in range(m,x-1,-1):
for j in range(n,y-1,-1):
dp[i][j] = max(dp[i][j],dp[i-x][j-y]+1)
return dp[m][n]