Так как я вчера стоял в торговой точке супермаркета, еще раз пытаясь эвристически найти оптимальный раздел моих монет, пытаясь игнорировать нетерпеливую и нервную очередь позади меня, я размышлял об основной алгоритмической проблеме:
Учитывая систему монет со значениями v 1 , ..., v n , ограниченный запас монет a 1 , ..., a n и сумма, которую мы должны заплатить.
Мы ищем алгоритм для вычисления раздела x 1 , ..., x n (с 0 <= x <sub>i <= a <sub>i ) с x 1 * v 1 + x 2 * v 2 + ... + x n * v n > = s, так что сумма x 1 + ... + x n - R (r) максимизирована, где r - это изменение, т.е. r = x 1 * v 1 + x 2 * v 2 + ... + x n * v n - s и R (r) - количество монет, возвращаемых кассиром. Мы предполагаем, что кассир имеет неограниченное количество всех монет и всегда возвращает минимальное количество монет (например, используя алгоритм жадности, описанный в SCHOENING и др.). Мы также должны убедиться, что деньги не меняются, поэтому лучшее решение - НЕ просто отдавать все деньги (потому что в этом случае решение всегда будет оптимальным).
Спасибо за ваш творческий вклад!