С тех пор, как вчера я стоял у торговой точки в супермаркете, еще раз пытаясь эвристически найти оптимальное распределение моих монет, пытаясь игнорировать нетерпеливую и нервную очередь позади меня, я размышлял о лежащей в основе алгоритмической проблеме:
Для монетной системы со значениями v1,...,vn ограниченный запас монет a1,...,a n и сумму s, которую нам нужно заплатить. Мы ищем алгоритм для вычисления разбиения x1,...,xn (с 0‹=xi‹= ai) с x1*v1+x2*v2 +...+xn*vn >= s такое, что сумма x1+...+xn - R(r) максимизируется, где r - изменение, т.е. r = x1*v1+x2 *v2+...+xn*vn - s, а R(r) - количество монет, возвращенных кассиром . Мы предполагаем, что кассир имеет неограниченное количество всех монет и всегда возвращает минимальное количество монет (например, используя жадный алгоритм, описанный в SCHOENING et al.). Мы также должны убедиться, что деньги не размениваются, так что лучшим решением будет НЕ просто отдать все деньги (потому что в этом случае решение всегда будет оптимальным).
Спасибо за ваш творческий вклад!