Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 19:26   #1
BvaKell
Новичок
Джуниор
 
Регистрация: 04.06.2013
Сообщений: 4
По умолчанию Размен монет на С++

Есть неограниченный набор монет разного достоинства (количество различных достоинств задается на момент старта алгоритма). Требуется разменять заданное число N этими монетами, найти наименьшее количество монет, которые в сумме дают величину N, или указать, что задача не имеет решения.

Помогите пожалуйста, в программировании новичок, но требуется срочно сдать...

Последний раз редактировалось BvaKell; 04.06.2013 в 19:35.
BvaKell вне форума Ответить с цитированием
Старый 04.06.2013, 21:33   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Помогите пожалуйста, в программировании новичок, но требуется срочно сдать...
Плохо. Это не очень лёгкая задача.
Ищите по ключевым словам "поиск в ширину", BFS. Если N не очень велико, можно создать массив из N значений и последовательно его заполнять.
Abstraction вне форума Ответить с цитированием
Старый 04.06.2013, 21:37   #3
BvaKell
Новичок
Джуниор
 
Регистрация: 04.06.2013
Сообщений: 4
По умолчанию

Мне подсказку дали использовать жадный алгоритм, язык программирования может быть с++, питон, с#
BvaKell вне форума Ответить с цитированием
Старый 04.06.2013, 21:43   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Мне подсказку дали использовать жадный алгоритм
Не понял?..
Пусть монеты 1, 5, 7. Берём N=11. Жадный алгоритм даёт разбиение 11=7+1+1+1+1, 5 слагаемых. Оптимальное решение 11=5+5+1, 3 слагаемых.
Abstraction вне форума Ответить с цитированием
Старый 04.06.2013, 21:55   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Это очень лёгкая задача. Если по условию, начинаем с бо'льшего и заканчиваем наименьшим.
Например - разменять 125 р 25 к.
Имеются купюры (монеты):
100 р
50 р
10 р
1 р
50 к
10 к
1 к

Берём наибольшее 100 р и вычитаем его из размениваемого числа.
125.25 - 100 = 25.25
Берём следующее "разменное число":
25.25 - 50 = -24.75
Результат отрицательный - отбрасываем
25.25 - (10 +10 (цикл)) = 5.25
5.25-10 = -4,75 - отбрасываем
5.25 - (1 + 5 ()в цикле) = 0.25
Ну и так далее. Предложите иной алгоритм.

Есть другая задача, имеющая более практическое значение.
В купюрообменнике имеются купюры разного достоинства, но их количество ограниченно и не равно. Придумать такой алгоритм, что-бы при любом, количестве вероятно обмениваемых купюр, ни одна ячейка не опустела, меньше чем на собственный номинал.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 04.06.2013 в 21:58.
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.06.2013, 22:22   #6
BvaKell
Новичок
Джуниор
 
Регистрация: 04.06.2013
Сообщений: 4
По умолчанию

Требуется разменять заданное число N этими монетами, найти наименьшее количество монет, которые в сумме дают величину N, или указать, что задача не имеет решения.
при использовании жадного, можно указать для некоторых случаев, что задача не решается...Да и с ним код попроще будет.Но проблема остается, написать мне его трудно, мне бы сам код,если не трудно...
BvaKell вне форума Ответить с цитированием
Старый 04.06.2013, 22:40   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

BvaKell, тук-тук-тук. Вы нас слышите? Я расписал алгоритм, а Вам, что по-башке, что по-лбу. Работаем или платим за решение. Вопросы есть?
- нет! Вы на программиста нахрена учитесь?, Что-бы студням бесплатно задачки решать? А не херово-ли будет?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.06.2013, 23:01   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Ну и так далее. Предложите иной алгоритм.
Приведён контрпример. В Вашем алгоритме есть контрпример покруче: N=12, набор 3,6,7. Вычитаем 7, вычитаем 3, облом. А размен существует.
Если нам скармливают массив пар достоинств монеты и её количества, причём изначально количества заполнены нулями, а достоинства упорядочены по убыванию и завершаются нулём, такой код всегда найдёт размен, если он существует:
Код:
bool FindChange(int N, int*const* coins){
  if(N==0) return true;
  if(**coins==0) return false;

  if(N < **coins) return FindChange(N, coins+1);
  if(FindChange(N-**coins, coins)){
    coins[0][1]++;
    return true;
  }
  return FindChange(N, coins+1);
}
Abstraction вне форума Ответить с цитированием
Старый 06.06.2013, 15:56   #9
BvaKell
Новичок
Джуниор
 
Регистрация: 04.06.2013
Сообщений: 4
По умолчанию

Сделал код на питоне, только проблема в том. что пользователь должен сам вводить кол-во монет определенного достоинтсва, как можно сделать. чтобы оно было неограниченным?
def Razmen(sm, mas, mon):
if not mas:
return False
for i in range(len(mas)):
n = sum(mon) + mas[i]
if n > sm:
continue
elif n < sm:
mon.append(mas[i])
m = Razmen(sm, mas[i+1: ], mon)
if not m:
mon.pop()
else:
mon.append(mas[i])
return True

if __name__ == "__main__":
massiv=[]
num = int(input('Kol-vo Dostoinstv: '))
summa = int(input('Summa: '))
n=0
while(n<num):
massiv.append(int(input()))
n=n+1
print (len(massiv))
massiv.sort(reverse=True)
mon = []
kol=len(massiv)
k=0
Razmen(summa, massiv, mon)
kol=kol-len(mon)
k=k+1
print ('Moneti s d-vom: ', mon)
print ('Itogovaya summa: ', sum(mon))
print ("")
BvaKell вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каталог монет в Delphi bormost2013 Фриланс 2 22.01.2013 06:40
Задача про подбрасывание N монет (C++) neutral_planet Помощь студентам 1 06.12.2011 20:24
у Пок-ля n монет достоинством H(1)..H(n). у продавца m монет B(1)...B(l). Купить вещь стоимости S (c++) Роза!!! Помощь студентам 4 07.05.2011 22:34
массы n идентичных на вид монет среди которых одна фальшивая - легче или тяжелее остальных Wintrymoon Паскаль, Turbo Pascal, PascalABC.NET 14 10.03.2008 23:10