可转化为01背包问题,sum为N,neg为dp[-1][-1]。
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
N, n = sum(stones), len(stones)
target = N // 2
dp = [[0] * (target+1) for _ in range(n)]
for j in range(target+1):
if j >= stones[0]:
dp[0][j] = stones[0]
for i in range(1, n):
for j in range(target+1):
if j < stones[i]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-stones[i]] + stones[i])
return N - 2 * dp[-1][-1]