Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.02.2013, 18:00
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 21  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от alatar Посмотреть сообщение
Не думаю, что это задание из универа. Больше похоже на тестовое задание при приеме на работу.
Тогда печально, для работодателя.
__________________
return this...

Старый 27.02.2013, 18:04
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 22  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Цитата:
Сообщение от AlexCooper Посмотреть сообщение
Тогда печально, для работодателя.
Почему? Хорошее же задание. Не всякий придумает оптимизированный алгоритм, но переборный должен уметь написать всякий.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 27.02.2013, 18:10
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 23  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Это почти стандартная "задача о сдаче".
Обычно она реализуется "жадным" алгоритмом. Т.е. выдачей минимального количества монет (благо в условии номиналы подходящие). Но тут доп.условие на строгое количество монет.
Проходимся жадным алгоритмом периодически исключая номиналы, пока получим (или не получим) искомое количество.
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 27.02.2013 в 18:39.
Старый 27.02.2013, 18:20
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 24  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Это как раз то, на что я кидал ссылку и о чем говорил Zebestov.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 27.02.2013, 18:23
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 25  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Сообщение от iflamberg Посмотреть сообщение
Да, ладно разлагольствовать. Автор темы уже давным-давно взял решение из №6. Которое, кстати не сработает на сложных случаях, типа:
Номиналы: [1.1, 1, 0.2]
Нарезать 2.3

Но, такой случай не реалистичен, конечно.
Почему не сработает? Я хоть и писал на коленке, но так сходу узреть алгоритмический косяк не могу. А проверять лень =)
Или имеется в виду, что я не учел количество монеток в разложении? Это да.
__________________
тут я

Старый 27.02.2013, 18:29
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 26  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Нарезает же тупо от большего к меньшему. Он нарежет 1.1(остаток 1.2), 1.1 (остаток 0.1), 0.2(остаток -0.1, ошибка).
А надо 1.1, 1, 0.2
__________________
мой пустой блог

Старый 27.02.2013, 18:32
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 27  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Да, верно, не учел )
__________________
тут я

Старый 27.02.2013, 18:35
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 28  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Сообщение от -De- Посмотреть сообщение
А как растягиваем? Например если монеты 10, 11, 110, число 110, из 11 монет собрать.
На втором проходе исключается номинал использованный для этой ячейки. Если после полного перебора у нас не выполняются условия, то пытаемся добавить "монету" из исходного набора (последовательно берем из набора монету, если условия не выполняются меняем ее на следующую из набора), если дошли до конца исходного набора и условия не выполняются, говорим что решения нет.

Т.е. в начале получим 10 раз по 11. После попытки удлинить получим 10 раз по 10. Прибавляем 11, не получилось. Прибавляем 10, все сошлось.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 28.02.2013, 00:47
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 29  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
ответ такой:
Код AS3:
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;
}
иногда лучше перебором решить вопрос, чем астронавтить графами или ещё чем в поисках оптимальности. 2-3 мс погоды не сделают


Последний раз редактировалось Nooob; 28.02.2013 в 01:05.
Старый 28.02.2013, 02:04
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 30  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
А я таки тоже сделал своим алгоритмом) Работает с любыми номиналами, с любым числом разложений. при ошибке невозможности разложения (когда минимальное число разложения больше, чем желаемое), выдаст сообщение
Единственный найденное пока ограничение - номиналы должны быть в порядке возрастания
Код AS3:
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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 20:21.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.