LeetCode 416 分割等和子集

2021-09-20 07:24:55 字數 972 閱讀 4995

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

注意:

每個陣列中的元素不會超過 100

陣列的大小不會超過 200

示例 1:

輸入: [1, 5, 11, 5]

輸出: true

解釋: 陣列可以分割成 [1, 5, 5] 和 [11].

示例 2:

輸入: [1, 2, 3, 5]

輸出: false

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

先將給定陣列nums的數全部加起來,判斷如果sum為奇數,那麼返回false。然後我們把和sum除以2,記為target。然後建立乙個二維dp陣列,行數為nums元素個數n,列數為target + 1。dp[i][j]表示陣列的前 i+1 個元素中,能否得到和為 j 的子集。dp陣列的第0行只有dp[0][0]和dp[0][nums[0]]是true,其他都是預設的初始值false。dp陣列的第0列除了dp[0][0],其餘都是預設值false,所以我們從第1行第1列開始計算dp陣列,如果在計算dp[i][j]時,j >= nums[i],那麼分為子集包括nums[i]和不包括nums[i]的情況,所以dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i]]; 不包括的情況和包括的情況中,有乙個為true,那麼dp[i][j]就為true。如果在計算dp[i][j]時,j < nums[i],那麼只有子集不包括nums[i]的情況了,所以dp[i][j] = dp[i-1][j]; 如此進行,在dp陣列全部計算結束後,返回dp[n-1][target]。

class solution 

}return dp[n-1][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...