题意理解
给定一个数组,求将其分成两组,是否存在两组内部元素的和相等。
问题分析
动规
问题转化为
给定一组元素,求是否存在这组元素中任意数量的元素加起来和等于这组元素的和的一半?
其他
链接
bool canPartition(vector<int>& nums) {
int sum = accumulate (nums.begin(), nums.end(), 0); //求和
if (sum % 2) { //和的一半是小数,
return false; //不可分割
}
sum = sum / 2;
int count = nums.size(); //计算数量
//cout << "count " << count << endl;
bool dp[count + 1][sum + 1] = {false}; //设置动规数组
dp[0][0] = true; //设置初值
sort (nums.begin(), nums.end()); //排序数表
for (int i = 1; i != count + 1; i ++) { //初始第一列,除左上角都为false
dp[i][0] = false;
}
for (int j = 1; j != sum + 1; j ++) { //初始第一行,除左上角都为false
dp[0][j] = false;
}
for (int i = 1; i != count + 1; i ++) { //i表示前i个元素
for (int j = 1; j != sum + 1; j ++) { //j就表示前i个元素的和
if (j >= nums[i - 1]) { //如果和比第i-1个元素大
dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i - 1]];//前i个元素和是否为j看前i-1个元素和是否为j,或者前i-1个元素和为j-第i个元素的值。
}
else { //j减第一个元素为负
dp[i][j] = dp[i - 1][j]; //不考虑i-1个元素的情况
}
}
}
/*
for (int i = 0; i != count + 1; i ++) {
for (int j = 0; j != sum + 1; j ++) {
cout << dp[i][j] << '\t';
}
cout << endl;
}
cout << endl;
*/
return dp[count][sum]; //输出最后一个元素
}