Те, що ви пропонуєте, є по суті варіантом проблеми "Рюкзак" , з додатковим поворотом, що завдяки стисненню файлів ви не починаєте знати, скільки ваших 20-мегабайтних "рюкзаків" буде займати кожен предмет.
Тривіальним рішенням, звичайно, було б просто закопувати кожен файл самостійно, але це не може зменшити кількість файлів, тому я підозрюю, що це не буде задовільним рішенням.
Якби мені поставили цю проблему, я вважаю, що я би почав, стискаючи кожен файл окремо до тимчасового місця (або в пам'яті, не записуючи їх на диск), просто так, щоб я міг отримати приблизний стислий розмір для кожного. За допомогою цієї інформації можна було б вирішити, які файли слід об'єднати за допомогою будь-якого зі стандартних підходів до проблеми "Рюкзак" та створити фактичні файли zip.
Якщо припустити, що у вас є доступна мова сценаріїв, і ви знаєте, як нею користуватися, я б очікував, що такий підхід буде досить простим для автоматизації; робити це вручну було б досить нудно, якщо у вас є більше, ніж кілька файлів, з якими можна мати справу ...