leetcode416 分割等和子集 動態規劃

2021-10-24 16:11:32 字數 1610 閱讀 9883

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。

注意:

示例 1:

輸入:[1

,5,11

,5]輸出:

true

解釋: 陣列可以分割成 [1,

5,5] 和 [11]

.

示例 2:

輸入:[1

,2,3

,5]輸出:

false

解釋: 陣列不能分割成兩個元素和相等的子集.

class

solution

if(sum %2)

return

false

;int target = sum /2;

return

dfs(nums,0,

0, target);}

bool

dfs(vector<

int>

& nums,

int pos,

int cur,

int target)

else

if(cur > target)

bool res =

false

;for

(int i = pos; i < nums.

size()

&&!res;

++i)

return res;}}

;

將求是否有求和等於全部元素的和的一半(target)的若干個元素轉化為0-1揹包問題

class

solution

if(sum %2)

return

false

;int target = sum /2;

vectorbool

>>

dp(nums.

size()

, vector<

bool

>

(target +1,

false))

;for

(int i =

0; i < nums.

size()

;++i)

else}}

return dp[nums.

size()

-1][target];}

};

降維

class

solution

if(sum %2)

return

false

;int target = sum /2;

vector<

bool

>

dp(target +1,

false);

for(

int i =

0; i < nums.

size()

;++i)

else}}

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