給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。
注意:每個陣列中的元素不會超過 100
陣列的大小不會超過 200
示例 1:輸入: [1, 5, 11, 5]
輸出: true
解釋: 陣列可以分割成 [1, 5, 5] 和 [11].
用動態規劃的方法,二維布林dp陣列儲存的是nums陣列下標從0到i的數字是否有若干個數字和為j,狀態轉移方程如**所示:
class
solution
if(sum%2!=
0)return
false
;int target=sum/2;
if(maxnum>target)
return
false
;//dp陣列的含義
//dp[i][j]代表nums陣列下標從0到i的數字是否有若干個數字和為j
boolean
dp=newboolean
[n][target+1]
;for
(int i=
0;i) dp[0]
[nums[0]
]=true
;for
(int i=
1;ireturn dp[n-1]
[target];}
}
這裡的**還可以進一步優化:把二維陣列轉化為一維陣列:
且需要注意的是第二層的迴圈我們需要從大到小計算,因為如果我們從小到大更新dp值,那麼在計算 dp[j] 值的時候,dp[j-nums[i]]已經是被更新過的狀態,不再是上一行的dp值。
class
solution
if(sum%2!=
0)return
false
;int target=sum/2;
if(maxnum>target)
return
false
;//dp陣列的含義
//dp[i]代表遍歷到此,是否有若干個數字和為j
boolean
dp=newboolean
[target+1]
; dp[0]
=true
;for
(int i=
0;ireturn dp[target];}
}
leetcode 416 分割等和子集
方法一 用動態規劃 class solution return res half 方法二 利用遞迴,dfs 此方法較動態規劃要好很多 基本思想 舉例子說明最容易理解,例如 nums 1,5,4,3,7 第一步 對陣列進行排序,nums 1,3,4,5,7 求出其和的一半 half 10 對於陣列中元...
LeetCode416 分割等和子集
主要的思想 於0 1揹包問題,解決方法是動態規劃。我們可以想到,把陣列分割成兩份,並且和相等,那麼每乙份的和是總和的一半。那麼問題就可以轉化為找到一組數,使得他們的和逼近sum 2,最後判斷最大的和是否等於sum 2,如果是則說明存在這樣的組合,也就是存在子集。其和為sum 2,當然了另乙個集合的和...
LeetCode416 分割等和子集
題目 給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 f...