在一行上输入一个整数
,表示小明想要购买的橙子数量。
如果不能通过购买整袋橙子凑出
个橙子,则输出
;否则,输出一个整数表示最少需要购买的袋数。
20
3
7
-1
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-06-25 优化题面文本与格式,修正为单组输入。
2. 2025-08-07 优化题面文本与格式,扩大数据范围。
3. 2025-11-19 优化题面文本与格式;补充一组样例。新增若干组测试数据。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 目标橙子数量
// 标签用于找到结果后直接结束
res: {
// 全用8个装的情况
if (n % 8 == 0) {
System.out.println(n / 8);
break res;
}
// 从多到少尝试8个装的袋数
for (int e = n / 8; e >= 0; e--) {
int left = n - e * 8; // 剩余橙子数
// 剩余数量能被6整除
if (left >= 0 && left % 6 == 0) {
System.out.println(e + left / 6); // 总袋数
break res;
}
}
// 无法恰好购买
System.out.println(-1);
}
sc.close();
}
}
#include <bits/stdc++.h>using namespace std;int main () { int n; cin >> n; for (int i=0; i<=17; ++i) { for (int j=0; j<=13; ++j) { if (6 * i + 8 * j == n) { cout << i + j << endl; return 0; } } } cout << -1 << 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();
flag:{if(n%8==0){
System.out.println(n/8);
}else{
for(int i=n/8;i>=0;i--){
int x=n-i*8;
if(x>=6&&x%6==0){
System.out.println(i+x/6);
break flag;
}
}
System.out.println(-1);
}
}
}
}
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
if(n%2!=0||n<6)
cout<<-1;
else{
int min=100;
for(int i=0;i<13;i++){
for(int j=0;j<17;j++){
if(8*i+6*j==n)
min=i+j;
}
}
cout<<min<<endl;
}
}
import java.util.*;
public class Main {
public static final int MAX = 105;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] bags = {6, 8};
int[] dp = new int[MAX];
for (int i=0; i!=bags.length; i++) {
dp[bags[i]] = 1;
}
Arrays.fill(dp, -1);
dp[0] = 0;
for (int i=1; i<=n; i++) {
for (int j=0; j<bags.length; j++) {
if (i - bags[j] >= 0 && dp[i - bags[j]] > -1) {
if (dp[i] == -1 ) {
dp[i] = dp[i - bags[j]] + 1;
}else {
dp[i] = Math.min(dp[i], dp[i - bags[j]] + 1 );
}
}
}
}
System.out.println(dp[n]);
return;
}
}