2009-02-27 6 views
2

一定の条件の下でNグループに番号のリストを割り当てる:アルゴリズムのは、私は番号のリストを持っているとしましょう

2,2,3,4,4 

スプリットNグループに数字(例として、ここでは3グループ):

A:2,3 sum:5 

B:4 sum:4 

C:2,4 sum:6 

私が望むのは、合計が最も多いグループ(ここでは6) - 最小のグループ(ここでは4)です。

誰もがこれを達成するアルゴリズムを考えていますか?


別の例:

7,7,8,8,8,9,9,10 

次のように結果は次のようになります。

A:7,8,8 sum:23 

B:7,8,9 sum:24 

C:9,10 sum:19 
+0

第1の例の最小のグループは2ではないでしょうか? – zaczap

+0

彼は最高の合計と最低の合計との差を最小にしたいと思うと思います。彼は問題の声明でいくつかの角括弧を使うことができました。 – Baltimark

+0

ああ、それは意味があります、ありがとう – zaczap

答えて

5

残念ながら、この問題はNP困難です。 multiprocessor schedulingまたはbin packingの参考文献を参照してください。また、そのアプローチに興味がある場合は、便利な近似アルゴリズムを見つけることもできます。

0

Zweiterlindeさんの提案は、bin packingをチェックアウトする方法です。

私は先に進んでこれを投稿しました。入力した後は間違っていたことを認識しました。

最初に最大の数字が使用される欲張りのアプローチが必要です。

  1. ソート注文
  2. がグループに最大の数字を入れる開始達成するためのリスト - 最初の数
  3. 停止に到達するために収まるようできるだけ多くのグループの最大数が
  4. ソートに達したときあなたのグループを合計し、最小のグループに最大の数字を加えて繰り返す。

これはあなたを取得する必要があります ... 2,2,3,4,4から

group 1 (4): 4 
group 2 (6): 4, 2 
group 3 (5): 3, 2 

と7,7,8,8,8,9,9,10から

。 ..

group 1 (18): 10, 8 
group 2 (24): 9, 8, 7 
group 3 (24): 9, 8, 7 

第2の例は、19,24,23のように実行できますが、これは間違っています。 Hmph。

+0

これは、数字に大きなギャップがあると分解します。 (10,1,1,1,1,1,1,1,1)を2つのグループに分割することを検討してください。正しい答えが(10)、(1,1,1,1,1,1,1,1)である間、あなたのアルゴリズムは(10,1,1,1,1)、(1,1,1,1) 。 – Welbog

+0

yup。私はそれをすべて入力した後に実現し、とにかくそれを送信すると思ったのです。 –

+0

問題はNP完全です。アルゴリズムがうまくいけば、100万ドルも豊かになります。 ;) – Welbog

関連する問題