class Solution(object):
def lastStoneWeightII(self, stones):
"""
:type stones: List[int]
:rtype: int
"""
# 1.dp
# 说实话,对于这个题一开始还真不知道怎么做,看了解析后做的,动态规划还得练啊
# 本题与LC416类似,目的就是想让石头分成两组,两组差距越小越好,最好是相等,相等的时候值为0,最小
# 用01背包来解决,dp[j]代表背包最大容量,最多能背dp[j]这么重的石头
n = len(stones)
if n < 2:
return stones[0]
total = sum(stones)
# 目标是target,不一定能取到,因为不一定能正好分为平等的两份,没有相等的两份,就要两份尽可能的差距更小
target = total // 2
dp = [0 for _ in range(target+1)]
for i in range(n):
# target是最大,既然上面循环已经先选择了第i个石头,那么背包现在最小就是stones[i],-1是因为[),能取到值
for j in range(target, stones[i]-1, -1):
dp[j] = max(dp[j], dp[j - stones[i]]+stones[i])
# 最后得到的dp[target]为背包最大的重量
# 剩下一部分的重量就是total - dp[target]
# 最小的可能重量就是两部分的差值,total - dp[target] - dp[target]
return total - dp[target] - dp[target]
动态规划--LC1049.最后一块石头的重量II
最新推荐文章于 2024-05-04 03:45:26 发布