题目
Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
Example 1:
Input: nums = [1,5,11,5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: nums = [1,2,3,5]
Output: false
Explanation: The array cannot be partitioned into equal sum subsets.
Constraints:
1 <= nums.length <= 200
1 <= nums[i] <= 100
题解
属于01背包问题,可以将问题抽象为“给定一个数组,求是否存在一个子集加和等于一个给定的和数”。
有两个问题需要确定,一个是和数,一个是递推公式
其中,该题中和数是隐含给出的,为所有数之和的一半
递推公式为
d
p
[
s
u
m
]
=
d
p
[
s
u
m
−
n
u
m
]
dp[sum] = dp[sum-num]
dp[sum]=dp[sum−num],其中
d
p
[
s
u
m
]
dp[sum]
dp[sum] 表示和数sum能否通过加和得到。这里只需要给
d
p
[
0
]
dp[0]
dp[0] 赋初始值即可
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for (int& elem : nums) {
sum += elem;
}
if (sum % 2) {
return false;
}
sum /= 2;
vector<bool> dp(sum+1, false);
dp[0] = true;
for (int& elem : nums) {
for (int c = sum; c >= elem; c--) {
dp[c] = dp[c] || dp[c - elem];
}
}
return dp[sum];
}
};