您可以免除集中的最多一個元素以實現目標。 例如: -將一組給定的數字N分成兩組,使它們的和的差值最小?
N = 3個
給定的數字是= 1,2,5
所以,
組1應該是: - [1]
集2應該是: - [2]
我們排除了5,因爲我們可以在沒有任何組的情況下獲得較小的差異。
N = 4
數= 1,2,2,5
SET1 = [1,2,2]
SET2 = [5]
什麼是最好的算法爲了這? 我知道這是一個NP完全問題。 我認爲蠻力會給我正確的解決方案,但如果可用的話我需要一個算法。
您可以免除集中的最多一個元素以實現目標。 例如: -將一組給定的數字N分成兩組,使它們的和的差值最小?
N = 3個
給定的數字是= 1,2,5
所以,
組1應該是: - [1]
集2應該是: - [2]
我們排除了5,因爲我們可以在沒有任何組的情況下獲得較小的差異。
N = 4
數= 1,2,2,5
SET1 = [1,2,2]
SET2 = [5]
什麼是最好的算法爲了這? 我知道這是一個NP完全問題。 我認爲蠻力會給我正確的解決方案,但如果可用的話我需要一個算法。
我知道,這是一個NP完全問題。
不完全,partition optimisation problem甚至被稱爲NP-hard。
我認爲蠻力會給我正確的解決方案,但我需要一個算法,如果可用的話。
NP-hard意味着沒有已知的算法(以確定解決方案)比強力方法執行得更好。
所以你可能需要一個,但哪一個只適合你的需要,只有你可以知道。
什麼是最好的算法呢?
定義「最佳」。
這是將整數集劃分爲兩個子集的一個着名問題的變體,其中兩個子集的總和相等或儘可能接近相等。然而,你提出的問題更難 - 你還必須檢查所有的組合,其中一個元素從原始集合中刪除。
由於原始問題是NP完全的,這個也是NP完全的(實際上,這是問題的優化版本,甚至是NP-hard,正如Bergi的答案中正確提到的那樣)。好消息是,即使在這個更難的版本中,貪婪的方法在大多數情況下都能給你一個滿意的答案。策略如下:從原始集合中取出最大元素,並將它們放入第一個和第二個子集中,每個子集中一個。來自原始集合的每個其他元素放在子集的總和較小的子集中,並迭代地重複該過程直到您選取所有元素。
要獲得最佳結果,您需要對原始集合的所有N個子集重複此過程,在這裏通過刪除索引爲1,2,...,N的元素來獲得每個子集。這是什麼讓這個問題變得更加困難。
如果您對更先進的方法感興趣,請看Karmarkar-Karp differencing algorithm。
參見:
僞多項式時間可以使用嗎? – harold 2015-02-07 10:40:27