解题思路

这是一个包装问题。关键点如下:

  1. 商店只提供6个装和8个装的包装
  2. 需要购买恰好 个橘子
  3. 要求使用最少的包装袋数
  4. 如果无法恰好购买 个橘子,输出-1

解题思路:

  1. 首先判断特殊情况:
    • 如果 小于6,无法购买
    • 如果 是奇数,无法用6和8凑出
  2. 使用双重循环尝试不同的组合:
    • 表示8个装的数量
    • 表示6个装的数量
  3. 时,记录总包装数 的最小值

代码

#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)

算法及复杂度

  • 算法:枚举
  • 时间复杂度: - 循环次数是固定的()
  • 空间复杂度: - 只使用常数额外空间