苹果装袋子问题(打表技巧)

public class test23 {

//问题:买苹果时,商店提供两种袋子,第一种一次装6个,第二种一次装8个
//小红有强迫症,使用的袋子必须最少且每个袋子必须装满。
//给一个正整数N的苹果数,返回至少使用多少袋子,如果无法满足小红的条件,返回-1

    //暴力思路先找规律
    public static int minBags(int apple){
        if(apple < 0){
            return -1;
        }
        int bag6 =-1;
        int bag8 = apple/8;
        int rest = apple - 8*bag8;

        while (bag8 >= 0 && rest <24){
            int restUse6 = minBagBase6(rest);
            if(restUse6 != -1){
                bag6 =restUse6;
                break;
            }
            rest =apple - 8*(--bag8);
        }
        return bag6 == -1 ? -1 : bag6 +bag8;
    }
    
    public static int minBagBase6(int rest){
        return rest%6 == 0 ? (rest /6):-1;
    }


    //根据打表规律补出代码,时间复杂度O(1)
    public static int minBagAwesome(int apple){
        if((apple & 1) != 0){
            return -1;
        }
        if(apple <18){
            return apple == 0 ? 0 : (apple ==6 || apple == 8) ? 1 : (apple == 12 || apple ==14 || apple == 16) ? 2 : -1;
        }
        return (apple -18)/8 +3;
    }

   

    
    //打印1到100内的苹果所装的最大袋子数,去发现规律
    public static void main(String[] args) {
        for (int apple = 1; apple <= 100; apple++) {
            System.out.println(apple +":" + minBags(apple));
        }
    }

}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值