0 1揹包 LeetCode 494 目標和

2021-10-20 22:39:18 字數 1532 閱讀 7447

494. 目標和

給定乙個非負整數陣列,a1, a2, …, an, 和乙個目標數,s。現在你有兩個符號+-。對於陣列中的任意乙個整數,你都可以從+-中選擇乙個符號新增在前面。

返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。

示例 1:

輸入:nums: [1, 1, 1, 1, 1], s: 3

輸出:5

解釋:-1+1+1+1+1 = 3

+1-1+1+1+1 = 3

+1+1-1+1+1 = 3

+1+1+1-1+1 = 3

+1+1+1+1-1 = 3

一共有5種方法讓最終目標和為3。

陣列非空,且長度不會超過 20 。

初始的陣列的和不會超過 1000 。

保證返回的最終結果能被 32 位整數存下。

假設正數組合的和為x,負數組合的和為y,此題要求得x - y = s,又因為x + y = sum,代入得x - (sum - x) = s,因此x = (s + sum) / 2,而ssum都是已知的,因此問題轉化為在nums中找出和為x的組合,且nums中的每個元素只能使用一次,因此是乙個典型的0-1揹包問題。注意到:如果x = (s + sum) / 2不能整除,則無法得到方案,返回0即可。

c++版本

class

solution

}return dp[cur];}

};

python版本

class

solution

:def

findtargetsumways

(self, nums: list[

int]

, s:

int)

->

int:

sum =

sum(nums)

if(s + sum)%2

==1or s > sum:

return

0 cur =

(s + sum)//2

dp =[0

]*(cur +1)

dp[0]

=1for x in nums:

for j in

range

(cur,x -1,

-1):

dp[j]

+= dp[j - x]

return dp[cur]

leetcode 494目標和 揹包dp

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

01揹包3 目標和494

給定乙個非負整數陣列,a1,a2,an,和乙個目標數,s。現在你有兩個符號 和 對於陣列中的任意乙個整數,你都可以從 或 中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。這個題的選擇就兩種,做加法或者做減法 不能選擇不加 所以其實是乙個動態規劃.又因為需要達到s,...

leetcode 494 目標和(DP 動態規劃)

給定乙個非負整數陣列,a1,a2,an,和乙個目標數,s。現在你有兩個符號 和 對於陣列中的任意乙個整數,你都可以從 或 中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。本題是典型的 動態規劃 問題。設陣列的長度為n,當陣列的前n 1項 nums 0 到nums ...