首页 > 其他分享 >买苹果

买苹果

时间:2023-01-14 17:55:06浏览次数:55  
标签:装完 num int 剩下 袋子 苹果

题目描述如图:

提示:

有两种带子,分别只能装6个和8个,不能多装,也不能少装。求最小的需要的袋子数。

思路:

显然如果能用8个袋子装绝对不用6的袋子,8的袋子能装更多,所需要的袋子数越少。

所以,我们先看看这n个苹果能不能用8的袋子装,如果不行,我们看看剩下的可不可以用6的袋子装。

此时有两种情况,1,剩下的苹果正好可以被用6的袋子装完,那就直接返回结果;2,剩下的苹果还是装不下。这时候,我减少一个8的袋子,那么剩下的苹果数就会在原来的基础上多出8个,这是我再来看剩下的苹果数能不能用6的袋子装完,以此类推。。。如果一直不行,就返回-1了。

代码:

private static int minBase6(int num) {
    return ((num%6) == 0 ? num/6 : -1);
}

//普通法
public static int minBags(int num) {
    if (num < 0 || num % 2 == 1) {
        return -1;
    }
    int bag6 = -1;
    int bag8 = num / 8;
    int rest = num - 8*bag8;
    while (bag8>=0 && rest<24) {
        int temp = minBase6(rest);
        if (temp != -1) {
            bag6 = temp;
            break;
        }
        rest = num - 8*(--bag8);
    }
    return bag6 == -1 ? -1 : (bag6+bag8);
}

先给6的袋子数量初始化为-1(这很有用)。剩下的逻辑都是之前讲过的,。唯一可能需要注意的地方是,为何while循环中还多了一个rest<24的条件呢?这是因为,当剩下的苹果数越来越多以至于都超过了24的时候,不用继续下去了,肯定再怎么装都装不了。这是因为24是6和8的最小公倍数。

举个例子,现在我想买的苹果数是45个。我们根据代码逻辑一步步来还原:

45能否全部用8的袋子来装?45/8=5余5,还剩5个,也不能用6的来装,这时减少一个8的袋子,于是剩下苹果13个;

13个苹果能否用6的来装?不行,再减少一个8的袋子,于是现在剩下苹果21个;

21个苹果能否用6的来装?不行,再减少一个8的袋子,于是现在剩下苹果29个;

到了29,超过了24了。你要判断29能不能用这两种袋子装完,肯定要先判断它能不能被8的装完,29/8=3余5,你会发现5能不能被6的装完你已经做过判断了,答案是不行。

 

标签:装完,num,int,剩下,袋子,苹果
From: https://www.cnblogs.com/EvanTheGreat/p/17052263.html

相关文章