算法题:购买n个苹果,苹果6个一袋或者8个一袋,若想袋数最少,如何购买?

这是面试一家公司java实习生的算法题,我当时把代码写出来了,但是回学校之后搜索别人的算法,才发现自己的算法实在是太简陋了呜呜呜

我的算法:

public void buy(int n){
  int min=9999;
  int sum=0;
   for(int i=0;i<=n/6;n++){
       for(int j=0;j<=n/8;j++){
            if(i*6+j*8==n){
             sum=i+j;
             if(sum<min){
             min=sum;
            }
           }
   System.out.println("最少购买的袋数为"+min);
}

我的思路是在 i 和 j 可能的范围内进行两次for循环,如果满足总苹果树为n,则给sum赋值,又因为要得到最少的袋数,所以紧接着用来选择排序来查找总袋数最少的情况。这个思路很死板,又要进行匹配又要进行排序。第一个可以改进的地方就是可以避免对j的循环,直接用if((n-i*6)/8==0)来代替,可以减少时间复杂度;第二个可以改进的地方就是得到最少袋数,不在得到sum之后对sum进行排序,而是从根源出发,思考如何才能使总袋数最少,于是得出思路----应该让8个一袋的袋数尽量的多。

下面是从网上借鉴的比较好的算法:

int solution(int n){
  int pack8=n/8;
  int pack6=0;
  int pack=0;
  for(pack8;pack8>=0;pack8--){
   if(n-pack8*8)/6==0){
   pack6=(n-8*pack8)/6;
   pack=pack8+pack6;
   return pack;
  }
 }
}
原文地址:https://www.cnblogs.com/iceywu/p/11862554.html