有一個淘寶商戶,在某城市有n個倉庫,每一個倉庫的儲貨量不一樣,如今要經過貨物運輸,將每次倉庫的儲貨量變成一致的,n個倉庫之間的運輸線路圍城一個圈,即1->2->3->4->...->n->1->...,貨物只能經過鏈接的倉庫運輸,設計最小的運送成本(運貨量*路程)達到淘寶商戶的要求,並寫出代碼。html
網上的解答多如牛毛, 也亂七八糟, 這裏是比較好的一個函數
列方程, 將全部的cost用一個變量表示。
如
av表示平均下來每一個倉庫的容量。 ki表示倉庫i向倉庫i+1輸送多少(能夠爲負),列出方程組
wi表示倉庫i的存儲量設計
av=w1+kn-k1 av=w2+k1-k2 av=w3+k2-k3 ... av=wn+ kn-1 + kn
將全部k都用kn表示, 有code
k1=kn+ w1 - av k2=kn+ w1+w2 - 2*av k3=kn+ w1+w2+w3 - 3*av ... kn = kn //這裏就沒必要也不能推出別的式子了
令 sum(i) = -(w1+w2+...+wi-i*av) (寫成這樣方便)htm
目標函數:blog
{ |kn-sum(1)|+|kn-sum(2)|+...+|kn-sum(n-1)| + |Kn| }
最小一乘, 中位數 sum(0)~sum(n-1)的中位數。ci
關於中位數的理論:
最小一乘和最小二乘
Modes, Medians and Means: A Unifying Perspectiveget
相似問題it
(摘自)
在一個按照東西和南北方向劃分紅規整街區的城市裏,n個居民點散亂地分佈在不一樣的街區中。用x 座標表示東西向,用y座標表示南北向。各居民點的位置能夠由座標(x,y)表示。io
街區中任意2 點(x1,y1)和(x2,y2)之間的距離能夠用數值|x1-x2|+|y1-y2|度量。
居民們但願在城市中選擇創建郵局的最佳位置,使n個居民點到郵局的距離總和最小。
由於任意2 點(x1,y1)和(x2,y2)之間的距離是用數值|x1-x2|+|y1-y2|度量的,那麼n個點P1----Pn到郵局地點P(x,y)的距離之和能夠表示爲: |x1-x|+ |x2-x|+……+|xn-x| + |y1-y|+ |y2-y|+……+|yn-y| 。
這樣一來,問題轉變爲分別求x軸和y軸上的一個點,使得該軸上的其餘點座標與該點座標的差的絕對值之和最小。
因而問題就變爲求解中位數。由於給定一個數列,中位數有這樣的性質 :全部數與中位數的絕對差之和最小。
下面給出簡略證實(由於若是證實中位數的性質正確,則該題就能夠用求解中位數來解題):
首先,給定一個從小到大的數列x1,x2,……,xn,設x是從x1到xn與其絕對差之和最小的數,則顯然x位於x1與xn之間。那麼,因爲x1,xn與它們之間的任意一點的距離之和都相等,且都等於xn-x1,所以接下來能夠不考慮x1與xn,而考慮剩下的從x2到x[n-1]的數,一樣顯然有x必然位於x2和x[n-1]之間,依次類推,最後得出的結論是x就是該數列中間的那個數,或者是中間的那兩個數之一,而這個數就是中位數。
結論:數列的中位數就是該數列各個數與其絕對差之和最小的數。