题目描述:
小易去附近的商店买苹果,奸许的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。
可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。
如果不能购买恰好n个苹果,小易将不会购买。
输入描述:
输入一个整数n,表示小易想购买n(1 <n< 100)个苹果
输出描述:
输出一个整数表示最少需要购买的袋数,
如果不能买恰好n个苹果则输出-1
输入
20
输出
3
分析:
首先,
6
和
8
都是偶数。因此,能凑出的个数也一定是偶数。程序中若苹果总数是奇 数,可以直接返回-1
。 再次,偶数个苹果数对
8
取模,其结果只可能为
0,2,4,6
。若余数为
6
或者
0
,则可以直 接用6
包装情况处理,不需要回溯购买
8
包装的情况。若余数为
4
,只需回溯
1
次即可,因为
8+4=12, 12%6 = 0。若余数为
2
,只需回溯
2
次即可,因为
8+8+2=18, 18%6 = 0
。 综上,可以采用如下思路进行处理。(由于 数字6
和
8
的特征,本方法只适用于本题) 情况
1
:若
num
不是偶数,则直接返回
-1
情况
2
:若
num%8 = 0
, 则返回num/8
情况
3
:若
num%8 != 0
,则只需回溯
1
次或者
2
次
8
包装购买个数,就可以求解。回溯
1
次,其 结果为n/8-1+2 = n/8+1
;回溯
1
次,其结果为
n/8-2+3 = n/8+1
。因此,可以情况
3
下,可以返回
n/8+1
。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(buyApple(n));
}
public static int buyApple(int n){
if(n<6||n==10||n%2!=0){
return -1;
}
if(n%8 == 0 ){
return n/8;
}
return n/8 + 1;
}
}