• 记一次拆分包裹的算法


         由于公司销售的商品从生产厂家拿过来的时候都是成箱装的,规格如下:大包装50个,中包装30个,小包装10个。而用户购买的时候,数量可能是70个、60个或5个这种数据 ,于是就有了拆包的需求。

    首先我们要怎么拆才能尽量避免不拆箱呢?原则上来讲,优先计算大包装,最后小包装,也就是说,从大到小的去拆包。

    例如用户购买了80个,可以拆为50*1+30*1+10*0 ,如果用户购买的数量是62个呢?则可以拆成50*1+30*0+10*1+1*2。

    了解怎么拆之后,就开始写代码咯,从上面的分析中,我们可以看出来,实际上的算法,就是用:(购买数量-(购买数量%包装单位))/ 包装单位 ,直到包装装位为1为止,

    下面不废话了,直接写核心代码:

    public class Main {
    
        static List<Integer> unitList;
    
        static {
            unitList = new ArrayList();
            unitList.add(1);
            unitList.add(10);
            unitList.add(30);
            unitList.add(50);
        }
    
        public static void main(String[] args) {
        
            unitList.sort(Comparator.reverseOrder());
    
         	
            splitPack(62, unitList);
           
        }
    
    
        public static void splitPack(int count, List<Integer> list) {
    
            Map<Integer, Integer> map = new LinkedHashMap<>();
    
            for (Integer currentUnit : list) {
                if (count % currentUnit == 0) {
                    map.put(currentUnit, count / currentUnit);
                    break;
                } else {
                    int packageCount = (count - (count % currentUnit)) / currentUnit;
                    map.put(currentUnit, packageCount);
                    count = count - currentUnit * packageCount;
                }
            }
    
    
            map.entrySet().forEach(x -> System.out.println(x.getKey() + "=" + x.getValue()));
        }
    }
    

    输出结果:

    50=1
    30=0
    10=1
    1=2

    即50个一箱的,有1个,30个一箱的有0个,10个一箱的有1个,单个包装的有2个。

  • 相关阅读:
    缓存穿透与缓存雪崩
    hibernate 用hql做中文排序
    设计一个算法,求非空二叉树中指定的第k层(k&gt;1)的叶子节点的个数
    CI框架源代码阅读笔记3 全局函数Common.php
    Linux安装中文man手冊
    ios 自己定义导航栏和切割线
    算法7-7:有向图简单介绍
    [Leetcode]-Min Stack
    ios28--UIScrollView
    ios27--kvo
  • 原文地址:https://www.cnblogs.com/zhuiyi/p/8034688.html
Copyright © 2020-2023  润新知