Вариант решения ниже, не очень оптимальный, подскажите любое другое решение.
var input = [5,10,0,12], //массив лимита каждой ячейки
total = 7, // сумма которую надо распределить равномерно
output = [];// результат распределения
//total = 7 => output = [2,2,0,3]
//total = 20 => output = [5,7,0,8]
//total = 40 => output = [5,10,0,12]
function fn(input, total, output) {
for (var i = 0; total; i = ++i % input.length) {
output[i] = output[i] || 0;
if (output[i] + 1 > input[i]) continue;
output[i]++;
total--
}
return output
};
console.log(fn(input, total, output))//[3, 2, 0, 2]