leetcode 494目標和 揹包dp

2021-10-10 02:32:04 字數 1226 閱讀 1901

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,...