Partion Equal Subset Sum ? 授课代码有点儿小问题
来源:9-7 面试中的0-1背包问题 Partition Equal Subset Sum
triump
2018-11-27
老师,你的代码有点儿问题,下面的memo[0] 应该初始化为true?
class Solution {
public:
bool canPartition(vector& nums) {
int sum = 0;
for(int i = 0 ; i < nums.size() ; i ++){
assert(nums[i] > 0);
sum += nums[i];
}
if(sum % 2)
return false;
int n = nums.size();
int C = sum / 2;
vector<bool> memo(C + 1, false);
for(int i = 0 ; i <= C ; i ++)
memo[i] = (nums[0] == i);
for(int i = 1 ; i < n ; i ++)
for(int j = C; j >= nums[i] ; j --)
memo[j] = memo[j] || memo[j - nums[i]];
return memo[C];
}
};
写回答
1回答
-
赞!
从memo的语义来讲,应该初始化为true。
不过,在这个问题中,由于有限定条件,nums中的所有元素一定为正,且nums非空。所以C = 0一定不是原问题的解。所以说memo[0]=false也ok:)
实际上,由于这个限制,在这个递推过程中,memo[0]的值根本不会影响结果。因为在递推过程中,访问memo[0]的时候,只有可能是j - nums[i] == 0的情况,而此时,memo[j]一定为true(因为memo初始化的方式)。所以memo[0]是多少不会影响||逻辑的结果:)
不信试一试,显示地将memo[0]初始化为true或者false,程序都是正确的:)
继续加油!
122020-03-17
相似问题