Для всех, кто еще интересуется этим вопросом ...
Я написал утилиту, которую я использовал для аналогичной цели - встраивать файлы в набор дисков / дисков.
Он использует интерфейс командной строки / файла.
Доступны версии на 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 одноместном ранце,
и пользователь выбирает наборы файлов на один диск для сборки в набор дисков -
помощь пользователю (но не полностью автоматизация) в обоих направлениях:
- линейная упаковка бункера - для полного набора дисков;
- 0-1 множественный рюкзак - для каждого поднабора дисков 1..k полного набора дисков
(где файлы имеют приоритет, иначе различаются по значению).
Полный программный выбор полного комплекта дисков,
будет дополнительной функцией.
Было бы недостаточно применить 0-1 раствор для одной рюкзака,
автоматически диск за диском [жадно].
(Рассмотрим 3 рюкзака вместимостью 6 и доступные предметы с одинаковой ценностью
и веса: {1, 1, 2, 2, 3, 4, 5}.
Применение 0-1 ранца к первому ранцу изолированно выберет
{1, 1, 2, 2} для получения суммы 4, после которой мы не можем уместить все
оставшиеся 3 предмета в оставшихся втором и третьем рюкзаках -
в то время как мы знаем, что можем поместить все предметы в 3 рюкзака как
{1, 2, 3} & {1, 5} & {2, 4}.)