1049. 最后一块石头的重量 II
题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II哔哩哔哩bilibili
思路:
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
sum_ = sum(stones)
target = sum_ // 2
dp = [0] * (target + 1)
# 动态规划更新
for stone in stones:
for j in range(target, stone - 1, -1):
dp[j] = max(dp[j], dp[j - stone] + stone)
# 计算最小可能的石头重量
return (sum_ - dp[target]) - dp[target]
494. 目标和
题目链接:494. 目标和 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和哔哩哔哩bilibili
思路:
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
# 计算nums的总和
total_sum = sum(nums)
# 此时没有方案
if abs(target) > total_sum:
return 0
if (target + total_sum) % 2 == 1:
return 0
# 加法和
add_sum = (target + total_sum) // 2
# 创建动态规划数组,初始化为0
dp = [0]*(add_sum+1)
# 当目标和为0时,只有一种方案,即什么都不选
dp[0] = 1
# print(dp)
for num in nums:
for j in range(add_sum,num -1 ,-1):
print(num,j)
# 状态转移方程,累加不同选择方式的数量
dp[j] = dp[j] + dp[j-num]
# print(dp)
# 返回达到目标和的方案数
return dp[-1]
474.一和零
题目链接:474. 一和零 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零哔哩哔哩bilibili
思路:
class Solution:
def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
dp = [[0] * (n + 1) for _ in range(m + 1)] # 创建二维动态规划数组,初始化为0
# print(dp)
# 遍历物品
for s in strs:
ones = s.count('1') # 统计字符串中1的个数
zeros = s.count('0') # 统计字符串中0的个数
# 遍历背包容量且从后向前遍历
for i in range(m, zeros - 1, -1):
for j in range(n, ones - 1, -1):
# 状态转移方程,符合要求,就在dp[i - zeros][j - ones]上加1,不符合要求就继承原来的值
dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1)
# print(dp)
return dp[m][n]