class
solution
: def findtargetsumways
(self, nums,s)
-> int:
# dp[i]
[j] means solutionnums
n=len(nums)
sum_max=
sum(nums)
sum_min=
-sum_max
dp=# dp=[[
0for _ in
range
(s+1)]
for _ in
range
(n+1)]
# 因為狀態轉移空間是往上找,所以初始化初始第一行就可以
# 狀態 空間不好定義,試用遞迴方式
def getdp
(i,j):if
(i,j) not in dp:
if i==0:
if nums[i]
==j and nums[i]
==-j:
return
2if nums[i]
==j or nums[i]
==-j:
return
1return
0 # 計算,只有兩種情況,+
1或者-
1 dp[i,j]=0
if j-nums[i]
<=sum_max and j-nums[i]
>=sum_min :
dp[i,j]
=dp[i,j]
+getdp
(i-1
,j-nums[i]
)if j+nums[i]
<=sum_max and j+nums[i]
>=sum_min :
dp[i,j]
=dp[i,j]
+getdp
(i-1
,j+nums[i]
)return dp[i,j]
return
getdp
(n-1,s
)s=solution()
print(s
.findtargetsumways([
0,0,
1],1
))
此揹包問題在於第一有正負,所以空間不好確定,所以用的遞迴,第二就是非負一定要注意零的問題 0 1揹包 LeetCode 494 目標和
494.目標和 給定乙個非負整數陣列,a1,a2,an,和乙個目標數,s。現在你有兩個符號 和 對於陣列中的任意乙個整數,你都可以從 或 中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。示例 1 輸入 nums 1,1,1,1,1 s 3 輸出 5 解釋 1 1 ...
leetcode 494 目標和(DP 動態規劃)
給定乙個非負整數陣列,a1,a2,an,和乙個目標數,s。現在你有兩個符號 和 對於陣列中的任意乙個整數,你都可以從 或 中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。本題是典型的 動態規劃 問題。設陣列的長度為n,當陣列的前n 1項 nums 0 到nums ...
01揹包3 目標和494
給定乙個非負整數陣列,a1,a2,an,和乙個目標數,s。現在你有兩個符號 和 對於陣列中的任意乙個整數,你都可以從 或 中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。這個題的選擇就兩種,做加法或者做減法 不能選擇不加 所以其實是乙個動態規劃.又因為需要達到s,...