题解 | #农场的奶牛分组II#
农场的奶牛分组II
https://www.nowcoder.com/practice/ae745225d12f44ca9e84486d051edbfa
大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
回溯算法,递归
题目解答方法的文字分析
这道题目要求将一群奶牛分成三组,使得三组奶牛的体重和相等。我们可以使用回溯算法来解决这个问题。
具体解答步骤如下:
- 首先,计算所有奶牛的体重和
totalWeight。 - 如果
totalWeight不能被3整除,说明无法分成三组,直接返回false。 - 创建一个大小为3的数组
groupSums,用来存储三组奶牛的体重和,初始化为0。 - 调用回溯函数
backtrack(),从第一个奶牛开始尝试将其分到三组中的某一组,每次分组时更新groupSums数组,并继续尝试下一个奶牛。 - 在回溯函数中,如果当前组的体重和等于
targetWeight(即totalWeight/3),则递归尝试分下一组;如果当前组的体重和超过targetWeight,则回溯到上一个奶牛重新尝试其他分组方案。
本题解析所用的编程语言
C++
完整且正确的编程代码
#include <vector>
using namespace std;
class Solution {
public:
bool canPartitionII(vector<int>& weights) {
int n = weights.size();
int totalWeight = 0;
for (int weight : weights) {
totalWeight += weight;
}
// 如果总体重不能被3整除,无法分成三组,直接返回false
if (totalWeight % 3 != 0) {
return false;
}
// 目标每组体重
int targetWeight = totalWeight / 3;
vector<int> groupSums(3, 0);
// 调用回溯函数进行尝试分组
return backtrack(weights, 0, groupSums, targetWeight);
}
private:
// 回溯函数
bool backtrack(vector<int>& weights, int index, vector<int>& groupSums, int targetWeight) {
// 所有奶牛都已分完,检查三组的体重和是否相等
if (index == weights.size()) {
return groupSums[0] == targetWeight && groupSums[1] == targetWeight && groupSums[2] == targetWeight;
}
// 尝试将当前奶牛分到三组中的某一组
for (int i = 0; i < 3; ++i) {
if (groupSums[i] + weights[index] <= targetWeight) {
groupSums[i] += weights[index];
if (backtrack(weights, index + 1, groupSums, targetWeight)) {
return true;
}
groupSums[i] -= weights[index];
}
}
return false;
}
};
阿Q的题解 文章被收录于专栏
阿Q秋招刷过的题
查看11道真题和解析