1. 问题分析与解题思路
这道买橘子的题目看似简单,但蕴含着经典的算法思想。我们需要用6个装和8个装的袋子组合出恰好n个橙子,并且要求袋数最少。这实际上是一个典型的整数线性规划问题,可以用数学方法建模为:求非负整数x和y,使得6x + 8y = n,并且x + y最小。
1.1 数学基础分析
首先,我们需要理解几个关键数学性质:
-
奇偶性分析:6和8都是偶数,所以任何6x + 8y的结果也必然是偶数。这意味着如果n是奇数,直接可以返回-1,无需进一步计算。
-
最大公约数:6和8的最大公约数是2。根据数论中的定理,只有当n是2的倍数时,方程6x + 8y = n才有整数解。这进一步验证了奇数n无解的正确性。
-
贪心策略:为了最小化袋数(x + y),我们应该尽可能多地使用容量更大的袋子(8个装),因为这样可以用更少的袋子装更多的橙子。
1.2 算法选择
基于上述分析,我们可以采用贪心+枚举的算法:
- 首先检查n是否为奇数,如果是直接返回-1
- 计算最多可以使用多少个8个装的袋子:max_8 = n / 8
- 从max_8开始向下枚举可能的8个装袋子数量
- 对于每个可能的8个装数量,检查剩余橙子是否能被6整除
- 找到第一个满足条件的组合即可返回,因为是从大到小枚举,所以第一个解就是最优解
这种算法的时间复杂度是O(n/8),对于n ≤ 1e5的约束条件来说完全足够。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现与详细解析
2.1 完整代码展示
让我们先看一下完整的C++实现代码:
cpp复制#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 奇数直接无解
if (n % 2 != 0) {
cout << -1 << endl;
return 0;
}
int max_8 = n / 8; // 最多能用多少个8个装的袋子
int remaining = n % 8; // 使用max_8个8袋后的剩余数量
// 从最多8袋开始向下枚举
