题目
小虎去附近的商店买苹果,奸诈約商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装包装不可拆分。可是小虎现在只想购买恰好n个苹果,小虎想购买尽量少的袋数方便撲带。如果不能购买恰好n个苹果,小虎将不会购买。输入一个整数n,表示小虎想购买的个苹果,返回最小使用多少袋子。如果无论如何都不能正好装下,返回-1.
- 贪心的思想,要装的袋子最少,那就优先使用8个苹果的袋子,看剩下的苹果能不能被6整除,如果不能,那减少一个8个袋子,看剩下的袋子能不能被6整除
- 优化:如果一直不能被6整除,8个袋子不必减少到最后,因为剩下的苹果必须是6的倍数,且假设用最多的8个袋子后剩余x个,x每次+8必须是6的倍数,当超过24,也就是6和8的最小公倍数后,下面的蓝色点代表x又回到了原点,说明不可能是6的倍数,所以只需要判断24之前每次+8能否是6的倍数就行,相当于追及问题,最小公倍数之前都没有相遇,之后相当于回到最初位置,永远也相遇不了
function process(num) {
// 奇数不可能装满
if (num % 2 !== 0) {
return -1;
}
let tag8 = Math.floor(num / 8);
let tag6 = -1;
let rest = num - 8 * tag8;
while (tag8 < 0 && rest < 24) {
if (rest % 6 === 0) {
tag6 = rest / 6;
break;
}
// 8个袋子数量-1,剩余苹果数量+8
rest = num - 8 * --tag8;
}
return tag6 === -1 ? -1 : tag8 + tag6;
}