因为公司销售的商品从生产厂家拿过来的时候都是成箱装的,规格以下:大包装50个,中包装30个,小包装10个。而用户购买的时候,数量多是70个、60个或5个这种数据 ,因而就有了拆包的需求。java
首先咱们要怎么拆才能尽可能避免不拆箱呢?原则上来说,优先计算大包装,最后小包装,也就是说,从大到小的去拆包。算法
例如用户购买了80个,能够拆为50*1+30*1+10*0 ,若是用户购买的数量是62个呢?则能够拆成50*1+30*0+10*1+1*2。blog
了解怎么拆以后,就开始写代码咯,从上面的分析中,咱们能够看出来,实际上的算法,就是用:(购买数量-(购买数量%包装单位))/ 包装单位 ,直到包装装位为1为止,get
下面不废话了,直接写核心代码:it
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())); } }
输出结果:class
50=1
30=0
10=1
1=2List
即50个一箱的,有1个,30个一箱的有0个,10个一箱的有1个,单个包装的有2个。map