То, что вы предлагаете, - это, по сути, разновидность проблемы рюкзака, с добавленной особенностью, заключающейся в том, что из-за сжатия файла вы не начнете знать, сколько из вашего 20-мегабайтного "рюкзака" займет каждый элемент.
Конечно, тривиальным решением будет просто сжать каждый файл независимо, но это не приведет к уменьшению количества файлов, поэтому я подозреваю, что это не будет удовлетворительным решением.
Если бы мне представили эту проблему, я бы начал с сжатия каждого файла по отдельности во временную папку (или в памяти, без записи их на диск), чтобы я мог получить приблизительный сжатый размер для каждого. С помощью этой информации можно будет решить, какие файлы следует сгруппировать, используя любой из стандартных подходов к проблеме ранца, и создать фактические zip-файлы.
Предполагая, что у вас есть язык сценариев, доступный для вас, и вы знаете, как его использовать, я ожидаю, что этот подход будет довольно простым для автоматизации; делать это вручную было бы довольно утомительно, если у вас есть более чем несколько файлов, чтобы иметь дело с ...