揹包入門 LeetCode416 分割等和子集

2021-10-12 06:55:49 字數 865 閱讀 4677

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

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

陣列的大小不會超過 200

示例 1:

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

輸出: true

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

示例 2:

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

輸出: false

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

動態規劃的基本流程是定義狀態並找到狀態轉移方程,再根據題目要求確定好初始化條件。

在這裡需要做乙個轉化(也許是這題最巧妙的地方了),將找兩個相等的子集問題,轉化為求:是否存在一些正整數可以湊成陣列和sum的一半。這時就可以想到揹包問題了:給定一些物品,能否將乙個容量為sum/2的揹包恰好裝滿。定義狀態:dp[i][j]表示能否從[0,i]這個區間內,挑出一些正整數放入集合,使得集合總和為j。

動態規劃其實是乙個分類操作,定義好狀態後,我們根據情況轉移狀態即可。

如果sum是奇數,肯定是不存在這樣的子集了,直接返回false;

如果nums[i]直接滿足容量j,那麼將物品直接放入,dp[i][j]為true;如果nums[i]>j,說明nums[i]不屬於總和為j的集合,此時的dp[i][j]=dp[i-1][j];

如果nums[i]

public boolean canpartition(int nums)  else if (nums[i] < j) }}

return dp[n-1][v];

}}

Leetcode416 分割等和子集 01揹包變種

暴力解法 public final boolean canpartition1 int nums 剪枝 int sum 0 int max 0 for int i 0 i nums.length i if sum 2 0 int target sum 2 if max target if max t...

分割等和子集 leetcode416

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 fals...

leetcode 416 分割等和子集

方法一 用動態規劃 class solution return res half 方法二 利用遞迴,dfs 此方法較動態規劃要好很多 基本思想 舉例子說明最容易理解,例如 nums 1,5,4,3,7 第一步 對陣列進行排序,nums 1,3,4,5,7 求出其和的一半 half 10 對於陣列中元...