因爲公司銷售的商品從生產廠家拿過來的時候都是成箱裝的,規格以下:大包裝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