zoukankan      html  css  js  c++  java
  • 记一次拆分包裹的算法

         由于公司销售的商品从生产厂家拿过来的时候都是成箱装的,规格如下:大包装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个。

  • 相关阅读:
    强制数据类型转换之Number类型
    强制类型转换之String类型
    数据类型之字符串类型与Number类型
    favicon.ico是什么?
    什么是自幂数?
    JavaScript基础之变量的自增与自减
    CMD 命令
    那些看完很有同感的语句
    HTML5 canvas 元素
    HTML的多媒体属性
  • 原文地址:https://www.cnblogs.com/zhuiyi/p/8034688.html
Copyright © 2011-2022 走看看