c++代码
class Solution {
public:
bool canPartition(vector<int>& nums)
{
int len = nums.size();//
int sum = 0;
for (int &x : nums)
sum += x;
if (sum % 2 != 0)//如果不是偶数肯定不能平分,都是整数
return false;
//把求和看作背包容量
//每个数(可以看作不同大小的西瓜的重量,只能整数斤)
//然后西瓜1元一斤,也就等价于你的包最多可以装多少钱的西瓜
//[当然西瓜得是完整的]
int bag = sum / 2; //背包容量 因为平分一个包就是总和的一半
vector<int> dp(bag + 1);//代表不同大小的包最多能装多少钱的瓜 因为是从0开始 得要dp[bag]这个结果
dp[0] = 0;//没有包,不能装瓜就是0
for (int i = 0; i < len; i++)//0 代表第一个瓜 之后会一个一个瓜放出来
{
for (int j = bag; j >= nums[i]; j--)//包最大的人先开始更新 只有当背包容量大于刚放出来的瓜大 才考虑要不要把瓜拿进来(拿进来可能需要丢弃之前拿的瓜,也可能不丢弃,这就是下面max做的)
{
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);
}
}
if (dp[bag] == bag)//如果容量为bag的包装的瓜价值为bag就说明可平分
return true;
return false;
}
};