判断是否能把数字分成相等的两部分,先求和sum,如果sum不是2的倍数那么返回false,然后就变成,搜索是否存在一堆数 求和为sum/2,
一开始想用递归:超时了
动态规划算法:声明一个大小为sum/2+1的数组,dp[0]=true,然后两层循环:
for(int num:nums){
for(int j=sum/2;j>=num;j--){
dp[j] = dp[j] || dp[j-num];//用当前元素和不用当前元素,哪一种情况为true,最终就为true
}
}
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sums = accumulate(nums.begin(),nums.end(),0);
if((sums&1)==true){
// 奇数
return false;
}
vector<int>dp(sums+1);
dp[0]=1;
sums = sums/2;
for(auto num:nums){
for(int i=sums;i>=num;i--){
dp[i] = dp[i]||dp[i-num];
}
if(dp[sums]) return true;
}
return false;
}
};

本文介绍了一种使用动态规划解决背包问题的方法,旨在判断能否将一组整数分为两个子集,使得两个子集的和相等。通过计算总和并利用布尔型数组进行状态转移,实现高效查找。
5213

被折叠的 条评论
为什么被折叠?



