题目
解题思路
这是一个包装问题。关键点如下:
- 商店只提供6个装和8个装的包装
- 需要购买恰好 n n n 个橘子
- 要求使用最少的包装袋数
- 如果无法恰好购买 n n n 个橘子,输出-1
解题思路:
- 首先判断特殊情况:
- 如果 n n n 小于6,无法购买
- 如果 n n n 是奇数,无法用6和8凑出
- 使用双重循环尝试不同的组合:
- i i i 表示8个装的数量
- j j j 表示6个装的数量
- 当 8 i + 6 j = n 8i + 6j = n 8i+6j=n 时,记录总包装数 ( i + j ) (i+j) (i+j) 的最小值
代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 特殊情况判断
if (n < 6 || n % 2 != 0) {
cout << -1 << endl;
return 0;
}
int minBags = 100; // 初始值设为一个较大数
// 尝试不同的组合
for (int i = 0; i < 13; i++) { // 8个装的数量
for (int j = 0; j < 17; j++) { // 6个装的数量
if (8 * i + 6 * j == n) {
minBags = min(minBags, i + j);
}
}
}
cout << minBags << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 特殊情况判断
if (n < 6 || n % 2 != 0) {
System.out.println(-1);
return;
}
int minBags = 100; // 初始值设为一个较大数
// 尝试不同的组合
for (int i = 0; i < 13; i++) { // 8个装的数量
for (int j = 0; j < 17; j++) { // 6个装的数量
if (8 * i + 6 * j == n) {
minBags = Math.min(minBags, i + j);
}
}
}
System.out.println(minBags);
}
}
n = int(input())
# 特殊情况判断
if n < 6 or n % 2 != 0:
print(-1)
else:
min_bags = 100 # 初始值设为一个较大数
# 尝试不同的组合
for i in range(13): # 8个装的数量
for j in range(17): # 6个装的数量
if 8 * i + 6 * j == n:
min_bags = min(min_bags, i + j)
print(min_bags)
算法及复杂度
- 算法:枚举
- 时间复杂度: O ( 1 ) \mathcal{O}(1) O(1) - 循环次数是固定的( 13 × 17 13\times 17 13×17)
- 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1) - 只使用常数额外空间

被折叠的 条评论
为什么被折叠?



