Какой алгоритм составить для подбора количества банок?
это называется «задача об упаковке» (packing problem) и решается полным перебором всех вариантов.

«Желательно» – это доп. условие, задающее «вес» разным вариантам. 
Надо сформулировать функцию потерь: на входе комбинация банок, на выходе «штраф» за неё, который складывается из объёма перебора (недобор не должен вообще приходить), и, может, из количества мелких банок (чтобы минимизировать его).
Перебирая все варианты, считать штрафы, оставлять варианты с минимальными штрафами.

Несколько интересных алгоритмов. См. там ещё ссылки слева.
У меня получилось такое решение. Спасибо большое, что приняли участие и помогли наставлениями :)
var n = 31;
var cans = [10, 15].sort(); // по возрастанию
var res = {};

while (n > 0) {
	let count = -1;
	for (let c in cans) {
		if (cans[c] < n) {
			count++;
		}
		else {
			count++;
			break;
		}
	}

	if (count < 0)
		continue;

	if (!res[ cans[count] ]) res[ cans[count] ] = 0;

	res[ cans[count] ]++;
	n -= cans[count];
}