この質問にまだ興味がある人のために...ファイルを一連のディスク/ディスクに収めるという同様の目的で使用するユーティリティを作成しました。コマンドライン/ファイルベースのインターフェイスを使用します。バージョンは、C、C++、および Java (C# ではありません) で利用できます。
http://whizman.com/code/diskfit.tgz
より詳細な情報は、diskfit.tgz:Doc/diskfit.txt ファイルにあります。
(AGPL3)
この質問は、0-1 の複数のナップザック、または線形ビン パッキングとして特徴付けることができます。(ナップザックの問題に関するリンクを提供してくれた jon-skeet に感謝します。)
Dthorpe は線形ビン パッキングを解決し、すべてのファイルにちょうど十分なビン/ディスクが収まるようにします [適切に O(n) または O(n lg n) 高速 - スクリプトを書かなくてもスプレッドシートで実行できる場合もあります]。
基本的に、diskfit (上記のリンク先のユーティリティ) は、0 ~ 1 個のシングル ナップザックに基づいて適格なファイル セットを出力し、ユーザーは 1 つのディスク ファイル セットを選択してディスク セットにアセンブルします - ユーザーを支援します (ただし、完全に自動化するわけではありません)。両方に向かって:
- リニア ビン パッキング - 完全なディスク セット用。
- 0 から 1 の複数のナップザック - ディスク 1..k の各サブセットのフル ディスク セット (ファイルが優先される場所、つまり値が異なります)。
このような完全なディスクセットをプログラムで完全に選択することは、追加機能になります。ディスクごとに [貪欲に] 自動的に 0-1 のシングル ナップザック ソリューションを適用するだけでは不十分です。(容量 6 の 3 つのナップザックと、同等の価値と重量を持つ利用可能なアイテムを考えてみましょう: {1, 1, 2, 2, 3, 4, 5}。0-1 のナップザックを最初のナップザックに単独で適用すると、{1, 1, 2, 2} を使用して合計値 4 を取得します。その後、残りの 3 つのアイテムすべてを残りの 2 番目と 3 番目のナップザックに収めることはできませんが、{1, 2, 3 のように 3 つのナップザックにすべてのアイテムを収めることができます。 } & {1, 5} & {2, 4}.)