494. 目標和
給定乙個非負整數陣列,a1, a2, …, an, 和乙個目標數,s。現在你有兩個符號示例 1:+
和-
。對於陣列中的任意乙個整數,你都可以從+
或-
中選擇乙個符號新增在前面。返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。
輸入: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
,而s
和sum
都是已知的,因此問題轉化為在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 ...