1

そこで、再帰を使用してx個の整数のint配列を取得し、それをn個のセットに分割するプログラムのアルゴリズムを理解しようとしています。これらの数値は、正と負の両方になります。セットは、それらの間で可能な限り最小の差を持つ必要があります。

たとえば、プログラムにint配列[1、2、3、4]を指定し、3つのグループに分割するように指示した場合、プログラムは[1、3][2]と[4]に分割されます。セットは2です。別の例は、配列[6、6、6、10、10]を指定し、2つのグループに分割するように指示した場合、[10、10]と[6、6、 6]ここで、セット間の差は2です。

配列は単純なsortステートメントであるため、配列は昇順(左が最小、右が最大)にソートされていると想定できます。何か案は?

編集:私はパーティションの問題を扱っていることを理解しており、最大数から最小数に移動して合計が最小のグループに入れる欲張りアルゴリズムを試しましたが、上記の2番目の例では機能しませんだから私はもっと信頼できるアルゴリズムを探しています。

4

1 に答える 1

0

より一般的なケース (kセット) での分割問題は、最小メイクスパン問題として知られています。この問題は に対して NP 完全ですk > 2。と について正確なアルゴリズムであるグラハム リスト スケジューリング アルゴリズムが知られk = 2ていk = 3ます。より大きなサイズの場合、NP 完全なソリューションを実装しない場合、多くの多項式時間近似アルゴリズムがあります。

于 2013-03-22T05:06:22.973 に答える