Алгоритм: набор суммы из множества других

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Алгоритм: набор суммы из множества других

Сообщение drronnie » 21.08.2006 (Пн) 9:14

Господа, такая трабла: не могу придумать алгоритм....
Есть некоторое множество дробных чисел от меньше 1 до 1000. Мне нужно из них набрать целую сумму, например 2900.... но как найти подмножество чисел этого множества, которые в сумме дают то, что надо мне.... может кто сталкивался когда?
Компиляция - перевод словесного поноса в машинный код.

onell
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 131
Зарегистрирован: 21.06.2006 (Ср) 16:04
Откуда: 2taev City

Сообщение onell » 21.08.2006 (Пн) 12:57

от меньше 1 до 1000
- это значит от минус бесконечности? И по какому принципу должен происходить набор?

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 21.08.2006 (Пн) 13:00

Да нет, он наверняка хотел сказать - от 0 до 1000. Просто не смог.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 21.08.2006 (Пн) 13:06

Перебор всех вариантов?
Быть... или не быть. Вот. В чём вопрос?

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 21.08.2006 (Пн) 13:12

uhm писал(а):Перебор всех вариантов?
В инете есть алгоритмы вроде поприличнее. Только мне искать некогда, пусть автор сам ищет. Помнится задачки такие были, какие нужно иметь монеты, чтобы можно было составить любую сумму и т.д.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.08.2006 (Пн) 13:19

Да, выдача сдачи в разменных апаратах.
Или взвешивание.
Задача типичная, но я забыл, как называется.
Lasciate ogni speranza, voi ch'entrate.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 21.08.2006 (Пн) 17:30

от меньше единицы это от меньше единицы.... например 0,37 грн.

Нужно из этого множества скоомбинировать заданную сумму.... ну например надо 4,50... мы выбираем 1,30; 1,20; 0,30; 0,70; 1 в сумме они дают на искомое число....

Алибек, а как она называется? То ли формулирую вопрос не правильно, но в поисковиках ничего похожего близко нет
Компиляция - перевод словесного поноса в машинный код.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 21.08.2006 (Пн) 18:14

drronnie писал(а):от меньше единицы это от меньше единицы.... например 0,37 грн.
Ну вот, яж говорю - не смог :mrgreen:
drronnie, а вы в школе отрицательные числа еще не проходили? Ну ничего, дойдете ...
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 22.08.2006 (Вт) 8:25

Ну однозначно отрицательные - это меньше нуля, а я говорил про меньше единицы. А вот вы видимо, vvs_adm, в школе искусство болтовни проходили, и освоили его на отлично: 3 ответа и ни одного по делу.
Компиляция - перевод словесного поноса в машинный код.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 22.08.2006 (Вт) 8:54

drronnie писал(а):Ну однозначно отрицательные - это меньше нуля, а я говорил про меньше единицы.
Прочитай еще раз то, что я написал. Можно три раза. И тогда ты поймешь...
drronnie писал(а):3 ответа и ни одного по делу.
Ну вообще-то второй ответ - ну прямо таки в точку. А Alibek его дополнил, дальше некуда. Осталось только яндекс открыть... Или ты все-таки хочешь, что бы я за тебя поискал?
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 22.08.2006 (Вт) 9:57

vvs_adm, хорошо из трёх ответов два не в тему...
Я вот понять не могу, почему всегда на форумах возникают умники, которые сначала дают "исчерпывающие разъяснения", а потом советуют обратится к поисковикам... Ну не знаешь и не интересно - молчи; знаешь - скажи; не знаешь и ИНТЕРЕСНО - предложи вариант, давай дискутировать.... ИМХО
Лично я к помощи форумов обращаюсь только после долгих безрезултатных поисков, и такую цель, как отметиться в каждом топике не приследую.

А с монетками, кстати не совсем то. Там алгоритм выглядит так: берём наибольшую монетку, не превышающую искомую сумму, затем снова и так добираем монетки до тех пор, пока не набрали нужную сумму...

Разница между этой и моей задачами в том, что у меня не фиксированй набор чисел, и не всегда (а на практике почти никогда) не получается набрать таким способом нужную сумму... Именно поэтому я и спрашиваю....
Компиляция - перевод словесного поноса в машинный код.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Re: Алгоритм: набор суммы из множества других

Сообщение vvs_adm » 22.08.2006 (Вт) 10:14

drronnie писал(а):Есть некоторое множество [положительных?] дробных чисел от [0?] меньше 1 до 1000
Ну вообще-то если бы ты корректно написал условие задачи, либо если бы onell не спросил, то и двух ответов "не в тему" просто бы не было. Хотя кто знает, может в твоей задаче дробные числа могут быть отрицательными? Почему бы и нет...
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 22.08.2006 (Вт) 10:33

Есть некоторое множество [положительных?] дробных чисел от [0?] меньше 1 до 1000

Вот это вопрос по существу... Да, положительных от нуля (не включая) его... Здесь речь идёт о суммах накладных, поэтому они не могут быть отрицательными и нулевыми

Да нет, он наверняка хотел сказать - от 0 до 1000. Просто не смог.

А это не более чем подковырка....
Компиляция - перевод словесного поноса в машинный код.

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 22.08.2006 (Вт) 10:39

Вот алгоритм, который дает Котов:
Имеются монеты c различными фиксированными номиналами, выраженными в копейках (например, 3 и 5 копеек) в достаточном количестве. Написать программу COINS.*, которая:

а) определяет, можно ли представить заданную сумму S (выраженную в копейках), пользуясь монетами заданных номиналов,
б) если это возможно, то представляет эту сумму с помощью минимального количества монет.

Входные данные: Входной файл COINS.DAT содержит в первой строке сумму S (0 < S < 1000000000), во второй строке - N - количество различных номиналов (0 < S < 20), а в следующих N строках - А1 ... АN - номиналы (в порядке возрастания), которые можно использовать (0 < A1 < A2 < ... < AN < 1000000000).

Выходные данные: Выходной файл COINS.SOL должен содержать в первой строке знак "+", если заданную сумму S можно представить, и знак "-", если нельзя. Если представленная сумма существует, то следующие N строк должны содержать количества монет каждого номинала, которые необходимы для представления суммы S с помощью минимального количества монет.

Примеры ввода и вывода

Представить 514 копеек с помощью монет номиналом в 3 и 5 копеек

COINS.DAT:
514
2
3
5

COINS.SOL:
+
3
101

Представить 27 копеек с помощью монет номиналом в 5 и 13 копеек

COINS.DAT:
27
2
5
13

COINS.SOL:
-

Решение g6_1026:
Для решения этой задачи нам понадобится знать, как находить НОД. Для этого надо прочитать Задачу #1019: Банки.
Итак, найдем НОД номиналов всех монет. Если необходимая сумма не делится на НОД нацело, то сразу выводим "-" (мы никак не можем набрать 5 рублей монетками в 2 и 4 рубля! Монеты в 4 рубля - моя идея.). Если же необходимая сумма делится на НОД без остатка, то придется действовать хитро:
Возьмем монету с наибольшим номиналом, возьмем наибольшее количество монет, так чтобы их сумма не превышала искомую сумму. Теперь посчитаем НОД оставшихся монет. Если остаток искомой суммы от тех денег, которые мы собрали, не делится на НОД, то уменьшим количество монет с наибольшим номиналом на 1 и снова проверим, делится ли остаток на НОД. Если делится - то переходим к следующей монете, если нет - то опять уменьшаем на 1 количество монет. Если в какой то момент количество монет стало отрицательным, то выводим "-" и выходим. Если вся сумма выразилась в определенном количестве монет разных номиналов, то выводим "+" и количество монет разного номинала (для хранения количества монет удобно организовать массив).


Была ещё где-то зачача, решенная Окуловым. Но, к сожалению, сейчас посмотреть не могу, т.к. нет ворда.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 22.08.2006 (Вт) 11:05

Oxygen, интересный алгоритм...попробую прикрутить к нему ограниченное количество монет....спасибо
Компиляция - перевод словесного поноса в машинный код.

Efiop
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.06.2006 (Вт) 12:14
Откуда: РК

Сообщение Efiop » 22.08.2006 (Вт) 11:06

drronnie
1. Пиши полное условие. В этом множестве могут числа повторяться или все разные? Потом, выводит все варианты или же нужно набрать необходимую сумму, используя наименьшее кол-во чисел?
2. На форумах "Алгоритмы" поищи, там точно есть.
Она чем-то похожа на задачу про "Рюкзак" и "Мешок картошки".

Вот про рюкзак.
Вложения
Задача_рюкзак.rar
(3.39 Кб) Скачиваний: 60

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 22.08.2006 (Вт) 12:23

drronnie писал(а):А это не более чем подковырка....
Ладно, возможно перестарался, за подковырку извиняюсь.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 22.08.2006 (Вт) 13:35

Efiop, некоторые могут повторяться, некоторые только в одном экземпляре...
Надо набрать сумму... не обязательно с меньшим количеством чисел, просто её нужно набрать, один вариант, не обязательно все...

vvs_adm, мир :D
Компиляция - перевод словесного поноса в машинный код.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 144

    TopList