![]() |
|
||||||||||
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Почему? Хорошее же задание. Не всякий придумает оптимизированный алгоритм, но переборный должен уметь написать всякий.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Это почти стандартная "задача о сдаче".
Обычно она реализуется "жадным" алгоритмом. Т.е. выдачей минимального количества монет (благо в условии номиналы подходящие). Но тут доп.условие на строгое количество монет. Проходимся жадным алгоритмом периодически исключая номиналы, пока получим (или не получим) искомое количество.
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 27.02.2013 в 18:39. |
|
|||||
|
Цитата:
Или имеется в виду, что я не учел количество монеток в разложении? Это да.
__________________
тут я |
|
|||||
|
Цитата:
Т.е. в начале получим 10 раз по 11. После попытки удлинить получим 10 раз по 10. Прибавляем 11, не получилось. Прибавляем 10, все сошлось.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Mar 2007
Сообщений: 319
|
ответ такой:
trace(searchCoins(new <Number>[0.01, 0.1, 0.25, 0.5, 1, 5], 2.53, 7)); function searchCoins (nominals:Vector.<Number>, sum:Number, n:uint, level:int = 0, result:Vector.<Number> = null):Vector.<Number> { result ||= new Vector.<Number>(); var length:uint = nominals.length; for (var i:int = 0; i < length; i++) { if (level == n) { var sumOut:Number = 0; for (var j:int = 0; j < n; j++) { sumOut += result[j]; } if (sumOut == sum) { return result; } continue; } result[level] = nominals[i]; if (searchCoins(nominals, sum, n, level + 1, result) != null) { return result; } } return null; } Последний раз редактировалось Nooob; 28.02.2013 в 01:05. |
|
|||||
|
А я таки тоже сделал своим алгоритмом) Работает с любыми номиналами, с любым числом разложений. при ошибке невозможности разложения (когда минимальное число разложения больше, чем желаемое), выдаст сообщение
Единственный найденное пока ограничение - номиналы должны быть в порядке возрастания package { import flash.display.Sprite; public class Main extends Sprite { private var nominals:Array; private var initialNumber:Number; private var quantity:uint; public function Main():void { nominals = [0.01, 0.1, 0.25, 0.5, 1, 5]; initialNumber = 2.53; quantity = 7; extendInitialNumber(nominals, initialNumber, quantity); } //Функция нахождения наибольшего номинала для искомого числа. возвращает индекс private function maximumDivider(_nominals:Array, _number:Number):int { var i:int = -1; while (int(_number / _nominals[++i]) >= 1 && i < _nominals.length); return i - 1; } //Функция нахождения разложения по номиналам. //Стоит отметить, что в случае невозможности разложения на заданное количество номиналов, выдаст сообщение private function extendInitialNumber(_nominals:Array, _number:Number, _quantity:uint):Array { var currentNumber:Number = _number; var desiredOutput:Array = new Array(); var counter:uint = 0; do { do { trace(currentNumber); var div:int = maximumDivider (_nominals, currentNumber); if (div != -1) { desiredOutput.push(_nominals[div]); currentNumber = toFixed((currentNumber - _nominals[div]),100); counter++; } } while (div != -1); if (counter > _quantity) { trace("Невозможно разложить число заданным количеством номиналов"); break; } else if (counter == _quantity) { trace("Решение найдено"); break; } currentNumber = desiredOutput[int(Math.random() * desiredOutput.length)]; } while (counter != _quantity); trace(desiredOutput); return desiredOutput; } //Вспомогательная функция округления для избежания ошибок, когда в результате вычитания // 2.53 - 1 получается 1.52999999 и прочих присущих AS3 ошибок private function toFixed(number:Number, factor:Number):Number { return (Math.round(number * factor)/factor); } } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|