解题思路
这是一个包装问题。关键点如下:
- 商店只提供6个装和8个装的包装
- 需要购买恰好
个橘子
- 要求使用最少的包装袋数
- 如果无法恰好购买
个橘子,输出-1
解题思路:
- 首先判断特殊情况:
- 如果
小于6,无法购买
- 如果
是奇数,无法用6和8凑出
- 如果
- 使用双重循环尝试不同的组合:
表示8个装的数量
表示6个装的数量
- 当
时,记录总包装数
的最小值
代码
#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)
算法及复杂度
- 算法:枚举
- 时间复杂度:
- 循环次数是固定的(
)
- 空间复杂度:
- 只使用常数额外空间