Lo que está proponiendo es esencialmente una variación del problema de la mochila , con el giro adicional de que, debido a la compresión de archivos, no comienza sabiendo cuánto ocupará su mochila de 20 MB en cada elemento.
La solución trivial, por supuesto, sería simplemente comprimir cada archivo de forma independiente, pero eso no reduce el recuento de archivos, por lo que sospecho que no sería una solución satisfactoria.
Si se me presentara este problema, supongo que comenzaría comprimiendo cada archivo individualmente en una ubicación temporal (o en la memoria, sin escribirlos en el disco), solo para poder obtener un tamaño comprimido aproximado para cada uno. Con esa información, sería posible decidir qué archivos deberían agruparse por cualquiera de los enfoques estándar para el problema de la mochila y crear los archivos zip reales.
Suponiendo que tenga un lenguaje de script disponible y sepa cómo usarlo, esperaría que este enfoque sea bastante sencillo de automatizar; hacerlo manualmente sería bastante tedioso si tienes más de un puñado de archivos con los que lidiar ...