package com.jiucaiyuan.net.question;
/**
* 【问题】小虎去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装,
* 包装不可拆分。可是小虎只想购买恰好n个苹果,小虎想够买尽量少的袋数方便携带。如果不能购买
* 恰好n个苹果,小虎将不会购买,输入一个整数n,表示小虎想购买的苹果个数,返回最小使用多少
* 个袋子,如果无论如何都不能正好装下,返回-1.
* 思路:
* 思路1:输入n,直接用8类型的袋子看最多需要多少个,n/8,剩下的苹果是否能用6类型的袋子正
* 好装下,如果不行,8类型袋子减少一个,剩下的苹果用6类型是否能装下,如果正好,那么答案出
* 来了,如果都试完了还不行,直接返回-1;
* 思路2:把apple从0-100打印出来,看规律,直接按照规律写代码
*
* @Author jiucaiyuan 2022/6/19 23:18
* @mail services@jiucaiyuan.net
*/
public class AppleMinBags {
/**
* 思路1
* @param apple
* @return
*/
public static int minBags(int apple) {
if (apple < 0) {
return -1;
}
int bag6 = -1;
int bag8 = apple / 8;
int rest = apple - bag8 * 8;
while (bag8 > 0 && rest < 24) {
int restUse6 = minBagBase6(rest);
if (restUse6 != -1) {
bag6 = restUse6;
break;
}
rest = apple - (--bag8) * 8;
}
return bag6 == -1 ? -1 : bag6 + bag8;
}
/**
* rest苹果正好用容量为6的袋子装下,返回袋子数,否则返回-1
*
* @param rest
* @return
*/
public static int minBagBase6(int rest) {
return rest % 6 == 0 ? rest / 6 : -1;
}
}