@AigizK

Как получить нужное число, который получается в результате сложения чисел из указанного массива?

Пусть у нас есть массив чисел. Задается число и надо представить это число как сумму чисел из этого массива.
Например:
А=[2,3,5,5,7]
Если B=10 то один из способов 2+3+5, а можно еще 5+5
Если В=6, то нет решения

Ограничения:
1. Числа в массиве могут повторяться
2. Одно число из массива нельзя использовать более 1 раза. Т.е. если надо получить 15, то не могу получить так 5+5+5,т.к. пятерок всего два.

Дополнение:
Я знаю, какие числа могут встречаться в массиве. Это: 1, 2, 5, 10, 50, 100, 500, 1000, 5000. Других быть не может.
Другими словами задача звучит так: у меня есть денежные купюры разного номинала, и в магазине надо купить товар без сдачи. Смогу ли я это сделать?
  • Вопрос задан
  • 8697 просмотров
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
В вашем примере каждое из чисел, кроме 5, делится на предыдущее. Поэтому, до определённого момента - пока осталось заплатить не меньше 10 руб, и в кошельке есть купюры не меньше 10 - можно пользоваться "жадным" алгоритмом - брать самую большую купюру, которая меньше остатка стоимости товара.
Допустим, что остались только монеты по 1,2,5 руб. Если есть хотя бы одна монета 1 руб - то платить пятирублёвой монетой безопасно, даже если останется нечётная цена - то набрать её рублём и двушками удастся. Если есть две монеты по 5 руб, и осталось заплатить не меньше 10 - смело тратьте одну из них. Вторую тратить подождите, это может быть опасно.
В конце концов у вас останутся только пятачки и двушки, причём либо пятачков не более одного, либо осталось заплатить меньше десятки. Смотрите. Если надо заплатить нечётную сумму: если пятачков нет или надо заплатить 1 или 3 рубля - задача неразрешима. В противном случае тратите пятачок, остаётся чётная сумма.
Пытаетесь набрать остаток двушками. Если их хватило - вы победили. Если нет, то вам подсунули неразрешимый пример...
Если бы набор купюр и монет был из времён СССР (1,2,3,5,10,15,20,50,100,300,500,1000,2500,5000,10000), задача была бы значительно сложнее и интереснее.

UPD. Моё решение неверно. Кто найдёт контрпример?

Более правильный вариант.
- если есть хотя бы одна монета в 1 руб, то работает "жадный" алгоритм - в цикле платите самой большой купюрой, которая у вас есть и не превышает остатка суммы.
- если монеты 1 руб. нет:
- - если сумма, которую надо набрать, нечётна, а пятачка нет, вы проиграли.
- - если сумма, которую надо набрать, нечётна, и есть хотя бы один пятачок, вносим его. Переходим к следующему пункту.
- - если остаток суммы, который надо набрать, чётен - объединяем пятачки в пары (и по одному пятачку платить не будем, даже если хочется). И запускаем жадный алгоритм. Если задача разрешима, то он справится.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg
Любые ответы на любые вопросы
Берете программу, которая перебирает все возможные сочетания чисел из массива и считает суммы.

Способ перебора сочетаний - берете число в двоичной системе счисления, в котором цифр столько, сколько у вас элементов массива.

Пробегаете массив и цифры двоичного числа. Если в числе 1, добавляете элемент массива к сумме. Если сумма сошлась - ура, иначе продолжаете перебор.
Ответ написан
AnnTHony
@AnnTHony
Интроверт
Как вариант, начинайте перебором вычитать из B числа массива, начиная с конца.
Например: B=10, А=[2,3,5,5,7]
10 - 7 = 3
Если 3 есть в А, то хорошо.
Дальше...
10 - 5 = 5...
Надеюсь понятно объяснил.

UPD: число В не должно быть больше суммы чисел в массиве.
UPD1: также нужно еще разницу чисел проверять на вхождения из массива. Сумбурно наверно описал все.
Ответ написан
Комментировать
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Перебором, использовать алгоритм последовательной генерации сочетаний из массива. Вот, например, реализация infostart.ru/public/240261
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы