2011-12-13 60 views
2

我有一個'somethings'的整數量,我想將它們分成組,每個整數量。不僅如此,他們必須儘可能均勻地分配。因此,舉例來說,我有9個蘋果(apples = 9),我需要將它們分成6組(groups = 6)。而且,讓我們說,我不能削減一個蘋果,所以apples/groups = 1.5,因此一組[1.5, 1.5, 1.5, 1.5, 1.5, 1.5]將無法​​正常工作。一種解決方案是[2, 2, 2, 1, 1, 1]或類似的。但我需要儘可能均勻地分發它們,因此解決方案必須是[2, 1, 2, 1, 2, 1]。或者如果將7個蘋果分成5組,解決方案將是[2, 1, 2, 1, 1]Python(/ C/Java):如何將整數除以整數,並生成均勻分佈的整數列表?

我知道你可以找到不同的'偶數'分佈,比如在9個蘋果分成6組的情況下說[1, 2, 1, 2, 1, 2]。但既然既不是更多均勻分佈,也不會。爲了辯論的緣故,我只是選擇了儘可能長的數字和替代數字。

如何找到解決方案,給定起始金額和我想要的組數量? [我更喜歡python,但是我懂Java/C/C++,所以任何都可以。]

背景:因爲我似乎對這個問題有很多的理解,下面是原因:我正在編寫自定義文本渲染器,我需要佈置合理的文本。這意味着儘可能均勻地將字符間的間距加上整數量的像素。儘快...

+0

有人至少可以向我解釋這個問題有什麼問題嗎? – Jeff

+0

作業?試圖在嘗試將其作爲應用程序實現之前先考慮算法。 – Pete

+0

我並不那麼愚蠢,我無法制定一個複雜的方法。但我需要一個快速的,我想弄清楚是否有任何技巧/內置的方法,可以幫助輕鬆生成一個解決方案 – Jeff

回答

14

如果您逐一瀏覽位置,在每個分配剩餘對象的最公平分配時,您將獲得所需的分配。對於你的9個物體分成6個位置的例子,如下:

9÷ 6 = 1.5,所以將2個蘋果分配到第一個位置(向上舍入)。

7÷ 5 = 1.4,所以將1個蘋果分配到第二個位置(向下舍入)。

6÷ 4 = 1.5,所以將2個蘋果分配到第三個位置(舍入)。

4÷ 3 = 1.33 ..,因此將1個蘋果分配到第四個位置(舍入)。

3÷ 2 = 1.5,所以分配2個蘋果到第五個位置(向上舍入)。

1÷ 1 = 1,所以將1個蘋果分配到第六個位置。

爲了得到a&divide的四捨五入; b來自C的截斷整數除法,只要總和不會溢出,就可以使用(a + b/2)/b

+0

簡直太棒了!比直到現在我嘗試編碼的任何方法都更加直接,pythonic,更快! – Jeff

2

您將它們分成相等的組,並將每個剩餘元素添加到不同的組,直到元素用盡。排除這種均勻分佈的排列。如果順序很重要,那麼有n個元素和k個組將每個元素從n%k個剩餘元素添加到每個n /(n%k)個組。就像它變得一樣。

你真的不需要任何特殊的工具來做到這一點。

編輯: 這可以在處理原始列表時完成,以便它維護訂單。基本上每個n /(n%k)子列表都必須有n/k + 1個元素。咖啡館的解決方案雖然更清潔。

+0

這不是作業!查看我剛剛添加的背景信息。它與在文本渲染器中實現文本對齊有關。這是一個個人項目,我只是假定具有更多經驗的程序員可能知道一些內置的python方法/庫或簡單的竅門。神...... – Jeff

+0

@Jeff好吧,檢查我的編輯。你不需要任何特殊的工具來做到這一點。 – soulcheck