题目描述如图:
提示:
有两种带子,分别只能装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