Как выбрать кратность из перечисленных кратностей для заданной суммы?
Ребята, добрый день, подскажите, пож-ста с алгоритмом. Ума не приложу.
Прошу помощи в вопросе.
Даны кратности 30, 70, 90, 100 .Сумма, которую вводит пользователь.
если пользователь введет 60 , то эта сумма не меняется. если пользователь введет 45-> сумма 70 155->160(30+70+30+30)
150->150(90+30+30)
UPD
Задача следующая.
Дано коробка-30шт - 2упаковки, коробка-70 шт- 3упаковки, коробка 90-1 упаковка, коробка 100- 8 упаковок
Есть поле инпут, в которое вводит пользователь
мне нужно, чтобы он смог сделать
- если пользователь ввел 60, то надо набрать СУММУ кратностей равную 60 (2 коробки по 30)
- если пользователь ввел 45, то надо набрать СУММУ кратностей равную 70 (1 коробка по 70, потому что в приоритет ставится дать меньшее число монет)
- если пользователь ввел 155, то надо набрать СУММУ кратностей равную 160 (4 коробки 30 70 30 30, или если числом монет то надо дать 2 коробки 90 и 70)
Клиент может заказать кол-во товаров превышающее наличие (30*2+70*3+90+8*100=1160). но тогда будет под заказ. Мне главное, чтобы запретить клиенту заказать 5 позиции- можно заказать только 30.
Динамическое программирование: выдача сдачи с использованием наименьшего количества монет. тык
Только немного изменить критерий соответствия, чтобы искало не конкретное число а диапазон от n и до n+k, где n это число введенное пользователем а k номинал наименьшей кратности.
dimonchik2013, почему не сумма? Под "суммой" видимо понимается сумма к оплате, а кратности - номиналы монет, которыми надо набрать эту сумму. Просто алгоритмическая задача по выдаче сдачи из кофейного автомата кем то немного бездумно переделана.
Конечно чистота формулировок не соблюдена, то есть тут вместо слова сумма уместней было бы слово сдача, но задача вполне понятная.
PS: а если вдуматься, то термин "сумма" именно сумму и подразумевает:
- если пользователь ввел 60, то надо набрать СУММУ кратностей равную 60 (2 монеты по 30)
- если пользователь ввел 45, то надо набрать СУММУ кратностей равную 70 (1 монеты по 70, потому что в приоритет ставится дать меньшее число монет)
- если пользователь ввел 155, то надо набрать СУММУ кратностей равную 160 (4 монеты 30 70 30 30, а вот тут не понятно какими критериями надо руководствоваться, если числом монет то надо дать 2 монеты 90 и 70)
PPS: NamnaR, пришел к выводу что задача не полная, так как не оговаривает критерии отбора монет (наименьшее количество, а может наименьший номинал или еще какие-то другие, без этого неясно почему когда ввод 45 то сумма должна быть 70 а не 60)
Роман, Спасибо. я пришла к выводу , что Ваш критерий отбора монет верен.
Задача следующая.
Дано коробка-30шт - 2упаковки, коробка-70 шт- 3упаковки, коробка 90-1 упаковка, коробка 100- 8 упаковок
Есть поле инпут, в которое вводит пользователь
мне нужно, чтобы он смог сделать
- если пользователь ввел 60, то надо набрать СУММУ кратностей равную 60 (2 коробки по 30)
- если пользователь ввел 45, то надо набрать СУММУ кратностей равную 70 (1 коробка по 70, потому что в приоритет ставится дать меньшее число монет)
- если пользователь ввел 155, то надо набрать СУММУ кратностей равную 160 (4 коробки 30 70 30 30, или если числом монет то надо дать 2 коробки 90 и 70)
Клиент может заказать кол-во товаров превышающее наличие (30*2+70*3+90+8*100=1160). но тогда будет под заказ. Мне главное, чтобы запретить клиенту заказать 5 позиции- можно заказать только 30.
1. есть произвольные кратности, (например 30, 70, 90, 100 но могут быть и другие)
2. есть некоторое число, которое необходимо собрать из этих кратностей, используя следующие ограничения:
- если число нельзя собрать из кратностей, то необходимо найти такую сумму кратностей, которая в превышает введенное число, но при этом является наиболее близким к нему
- если есть несколько вариантов как собрать из кратностей нужное число, то выбирается вариант, содержащий наименьшее число кратностей (или наименьшие номиналы кратностей или еще какое то другое условие)
Если я что то не допонял, распишите удовлетворяющие Вас условия, наподобие того как это сделал я. Только пожалуйста без таких вот объяснений (Дано коробка-30шт - 2упаковки, коробка-70 шт- 3упаковки, коробка 90-1 упаковка, коробка 100- 8 упаковок) я 5 минут думал что бы это могло обозначать, но так и не придумал:)
Роман, спасибо за внимание.
1. Да, верно 2. есть некоторое число, которое необходимо собрать из этих кратностей, используя следующие ограничения:
- если число нельзя собрать из кратностей, то необходимо найти такую сумму кратностей, которая в превышает введенное число, но при этом является наиболее близким к нему
верно
- если есть несколько вариантов как собрать из кратностей нужное число, то выбирается вариант, содержащий наименьшее число кратностей (или наименьшие номиналы кратностей или еще какое то другое условие)
верно, но меня это условие не волнует.
Короче , ситуация следующая
Есть магазин-инет, открываем карточку товара.
По данному артикулу этого товара мы продаем коробки :
а)в упаковке -20шт, -кратность 20 (кол-во коробок=4)
б)в упаковке -50шт,-кратность 50 (кол-во коробок=2)
в)в упаковке -90шт.-кратность 90 (кол-во коробок=1)
всего у нас шт-(20*4+50*2+90=270шт)
в поле ввода количества по умолчанию стоит 20шт(найменьшая кратность), если мы нажмем клавишу вверх( то увеливываем на 20 в поле-инпут станет40)
если мы поменяем значение в самом поле, то должен стоять алгоритм
если мы введем 50 или 90, то система ничего не меняет.
если мы введем 45 то система в поле инпут должна поменять на 50.
если мы введем 70 , то система должна вывести окно (ты можешь взять 70, но коробки 20 и 50)- ставим галочки
если мы введем 290 шт- система выведет (коробка 20шт-4, коробка 50шт-2, коробка 90шт -1) + заказ 20шт -ставим галки
и заказываем в корзину.
Вот это условие непонятно:
"если пользователь ввел 45, то надо набрать СУММУ кратностей равную 70 (1 коробка по 70, потому что в приоритет ставится дать меньшее число монет)"
Если без него, то решение вот такое (для 45 ответ будет 60):
def f(v):
n=(v+9)//10
if n<7: n=(n+2)//3*3
if n in (8,11): n+=1
return n*10