贪心 苹果装袋子

136 阅读1分钟

题目

小虎去附近的商店买苹果,奸诈約商贩使用了捆绑交易,只提供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的倍数就行,相当于追及问题,最小公倍数之前都没有相遇,之后相当于回到最初位置,永远也相遇不了

image.png

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;
}