1. 程式人生 > >記一次拆分包裹的算法

記一次拆分包裹的算法

linked true link 公司 string hashmap system 需求 light

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

記一次拆分包裹的算法