大家好,我是开车的阿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; } };