分割等和子集
分割等和子集
题目
给你一个 只包含正整数的非空数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例
![]() |
|---|
解题思路
1.判断数字总和是否为偶数,如果为奇数,则不能成功分割两个元素和相等。
2.可以利用动态规划中的背包问题,使得背包容量为target = sum /2;
3.如果容量为target背包容量刚好能够装满target。则表示背包能够成功被分割成两个元素和相等的子集。
4.如何判断当前问背包容量中装的容量最大值。
5.通过动态规划,可以得到状态方程为dp[k] = max(dp[k], dp[k-nums[i]]+nums[i]);其中dp[k]表示当前状态下最大容量,dp[k-nums[i]]+nums[i]:表示当前物品能够放入到背包中,则容量k-nums[i]最大值+当前物品。
6.最后判断dp[target]是否与target值相同。
代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int result = 0;
for(int i = 0; i < nums.size(); i++){
result = result + nums[i];
}
if(result % 2 == 1) return false;
int target = result / 2;
vector<int> dp(target+1, 0);
for(int i = 0; i < nums.size(); i++){
for(int k = target; k >=nums[i]; k--){
dp[k] = max(dp[k], dp[k-nums[i]]+ nums[i]);
}
}
if(dp[target] == target)
return true;
return false;
}
};


浙公网安备 33010602011771号