LeetCode刷題日記 416. 分割等和子集
題目給出一個陣列nums,陣列中包含一些正整數,問能夠將這個陣列分成兩個子集,使得這兩個子集相等。首先一上來的想法是將數列中所有的數和求出,然後看陣列中能不能將其中的某些陣列成總和的一半。這裡需要用到動態規劃的思想。用dp[i][j]來表示陣列從0到i範圍內能否表示數字j。我們用size函式可以得到陣列n,通過求合再除以2可以得到目標target。然後我們就能建立dp陣列如下:
vector<vector <int>>(n,vector<int>(target + 1, 0)) //target + 1防止陣列越界
首先通過思考,我們可以先得到dp陣列中以下兩點的值:
- 只要不選取任何陣列,我們就可以組成0,因此dp[i][0] = true;
- 當i = 0 時,只有正整數nums[0]可以被選取。因此dp[0][nums[0] = true;
然後,通過推導,我們可以得到以下狀態轉移方程:
最終我們返回答案dp[n][target]即可。
程式碼如下:
class Solution {
public:
bool canPartition(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n = nums.size();
if(n < 2) return false;
int sum = 0;
for(int i = 0; i < n; ++i)
{
sum += nums[i];
}
if(sum % 2 != 0) return false;
int target = sum / 2;
vector<vector<int>> dp(n, vector<int>(target + 1, 0));
for (int i = 0; i < n; i++) {
dp[i][0] = true;
}
dp[0][nums[0]] = true;
for (int i = 1; i < n; i++) {
int num = nums[i];
for (int j = 1; j <= target; j++) {
if (j >= num) {
dp[i][j] = dp[i - 1][j] | dp[i - 1][j - num];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n - 1][target];
}
};
相關文章
- 【每日一題-leetcode】416. 分割等和子集每日一題LeetCode
- Day 37 | 01揹包問題 、416. 分割等和子集
- 【LeetCode動態規劃#06】分割等和子集(01揹包問題一維寫法實戰)LeetCode動態規劃
- 程式碼隨想錄演算法訓練營第41天 | 01揹包問題 二維 、 01揹包問題 一維 、 416. 分割等和子集演算法
- 【刷題日記】leetcode-767 重構字串LeetCode字串
- 【刷題日記】leetcode-493 翻轉對LeetCode
- LeetCode 刷題筆記LeetCode筆記
- leetcode刷題筆記LeetCode筆記
- LeetCode刷題記錄LeetCode
- 程式碼隨想錄day35 || 416 分割等和子集
- leetcode刷題筆記605LeetCode筆記
- leetcode刷題記錄 661~LeetCode
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- leetcode刷題筆記(3)(python)LeetCode筆記Python
- LeetCode刷題記錄——day1LeetCode
- LeetCode刷題記錄——day2LeetCode
- LeetCode刷題記錄——day3LeetCode
- LeetCode刷題記錄——day4LeetCode
- LeetCode刷題記錄——day5LeetCode
- LeetCode刷題筆記9.2-9.9LeetCode筆記
- leetcode刷題筆記8.5-8.9LeetCode筆記
- [LeetCode刷題筆記] 關於LeetCode的前言LeetCode筆記
- 【LeetCode刷題(困難程度)】132. 分割回文串 IILeetCode
- LeetCode-劍指Offer刷題記錄LeetCode
- LeetCode刷題記13-27. 移除元素LeetCode
- LeetCode刷題記錄與題解(C++版本)LeetCodeC++
- LeetCode刷題整理LeetCode
- leetcode刷題(一)LeetCode
- LeetCode刷題 堆LeetCode
- LeetCode 刷題—樹LeetCode
- Leetcode刷題筆記8.12-8.16LeetCode筆記
- LeetCode 刷題指南(一):為什麼要刷題LeetCode
- [LeetCode]78. 子集LeetCode
- 如何使用leetcode刷題LeetCode
- leetcode刷題--Majority ElementLeetCode
- leetcode刷題--Count PrimesLeetCode
- leetcode刷題--Reverse BitsLeetCode
- leetcode刷題--Rotate ArrayLeetCode