Как выяснили в комментариях, метрика будет sum_i w[i]^2 (actual[i]/ needed[i] - 1) ^ 2.
пусть x[i] - соклько i-ого продукта
Пусть a[i][j] - сколько в еденице i-ого продукта j-ого ингредиента. Тогда всего j-ого ингредиента будет sum_i a[i][j] x[i].
Тогда получаем следующую оптимизационную задачу:
Sum_j (sum_i A'[i][j] x[i] - C[i]) ^ 2 -> min
sum_i x_i = 1
x_i >= 0
Сумма всего приравнивается к 1, потому что иначе надо считать пропорции и получится вообще ужас-ужас.
A'[i][j], C[i] - какие-то числа, которые элементарно получаются из a[i][j], w[i] и needed[i].
A'[i][j] = a[i][j]*w[j]/needed[j]
C[j] = w[j] / needed[j];
Это вообще-то задача квадратичного программирования, и есть всякие солверы для нее, но тут специфичный случай - можно получше что-то придумать.
Можно применить метод лагранжа, а точнее метод
Каруша — Куна — Таккера
Сначала выразите x_1 = 1 -sum_j>1 x_j, подставьте во все уравнения и получите:
Sum_j (sum_i A''[i][j] x[i] - C'[i]) ^ 2 -> min
sum_i x_i -1 <= 0
x_i >= 0
Это уже похоже на то, что есть в википедии. Тут одно условие, поэтому будет один множитель лямбда. Надо составить функцию лагранжа, взять все ее производные по x_i и приравнять к 0. Полутчится система линейных уравнений.
Для условия жесткости придется рассмотреть 2 случая - лямбда - 0 или тогда sum_i x_i - 1 = 0
Прорешать оба случая (СЛАУ) и взять те, где все получается положительным.
Это что-то близкое к методу наименьших квадратов, но тут вводятся дополнительные переменные, чтобы боротся с ограничениями неотрицательности и общей суммы.