01 背包
class Solution {
public:
bool canPartition(vector<int>& nums) {
int N = nums.size();
int sum = 0;
for(int i=0;i<N;i++) sum+=nums[i];
if(sum&1) return false;
// 01背包-容量sum/2
sum /= 2;
int dp[sum+1];
memset(dp,0,sizeof(dp));
for(int i=0;i<N;i++){
for(int j=sum;j>=nums[i];j--){
dp[j] = max(dp[j],dp[j-nums[i]] + nums[i]);
}
}
return dp[sum] == sum;
}
};
本文深入探讨了01背包问题的解决方法,通过一个具体的代码示例,详细讲解了如何使用动态规划算法来判断一组数是否可以分为两个子集,使得两子集的和相等。文章提供了一个C++实现的解决方案,展示了从初始化状态数组到更新状态的全过程。
5万+

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



