R4-dp
铁血回归
和目标和一样
问题:
n个数,每个数都可以+或者-
求最小的非负数和
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
#先计算石头的总重量
total=sum(stones)
#负数下标右移,整体右移total
dp=[False]*(2*total+1)
#相当于原来0的位置
dp[total]=True
for i,x in enumerate(stones):
new=[False]*(2*total+1)
for j in range(2*total+1):
# 如果之前一轮某个值可以取到
# 那么本轮 该值 -x +x 的值也可以取到
if dp[j]:
if j-x>=0:
new[j-x]=True
if j+x<=2*total:
new[j+x]=True
dp=new
for i in range(total,2*total+1):
#返回第一个>=0的位置。减去偏移量
if dp[i]:
return i-total
return -1