版权声明:自由转载-非商用-非衍生-保持署名 https://blog.csdn.net/mgsweet/article/details/78975497
解题思路
在查0-1背包问题时发现了这道题,首先关键是转化问题,我们设f(i, w)表示到第i个数字时,能否取得和为w(代表一个bool值),那么可以得知f(i, w) = f(i - 1, w - nums[i]),由于题目其实是要我们去求能否通过选择数组中的部分数来获得和的一半,所以我们把最大的w设为和的一半即可,而且由于每次循环f[i][w]只与上一层循环得到的f[i -1][x]有关,故只需要一维数组,每次更新数组值即可。
详细参考:
https://www.cnblogs.com/shinning/p/6027743.html
代码
class Solution {
public:
const int MAX_N = 202;
bool canPartition(vector<int>& nums) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
vector<bool> f(sum / 2);
for (int i = 0; i < f.size(); i++) {
f[i] = false;
}
f[0] = true;
for (int i = 0; i < nums.size(); i++) {
for (int j = sum / 2; j >= nums[i]; j--) {
f[j] = f[j] || f[j - nums[i]];
if (f[sum / 2]) return true;
}
}
return false;
}
};