Страницы: 1
RSS
Разбиение числа на кратные слаагемые
 
Добрый день.

Помогите, пожалуйста. Есть такая задача: есть число (количество вещей), нужно найти варианты его разбиения на слагаемые кратные 8 и 10 (вместимость оборудования). Т.е. по сути найти a, b в формуле 8a+10b. Например, для 26 результат должен быть 2 (8 ки) и 1 (10-ка). Если число без остатка не делится, то вариант с минимальным остатком.
 
Elensior, а как, например, должно быть разбито 11? Покажите в файле несколько требуемых разбиений
Соблюдение правил форума не освобождает от модераторского произвола
 
Добрый день.
Можно попробовать решить задачу при помощи инструмента "Поиск решения". Как конкретно - можно показать в файле-примере.
Кому решение нужно - тот пример и рисует.
 
На выходе нужно что то вроде такой таблички.
При этом есть два случая, которые очень хотелось бы учесть:
- В случаях как для 15 в идеале бы видеть разбивку с округлением вверх - отметила как отрицательный остаток.
- Если число без остатка или с равными остатками раскладывается между 8 и 10 (как 40), то видеть оба варианта. Или хотя бы признак в доп колонке.

Буду рада любой помощи!
 
Elensior, 40 вы 2 раза указали, это потому что есть 2 варианта разложения на слагаемые? Т.е. в изначальном варианте 40 должен быть один раз, а варианта предложено 2? Или если такое число будет в исходнике 1 раз и то и вариант предлагать только 1?
Вот горшок пустой, он предмет простой...
 
Это если есть два варианта для одного числа из исходника.
 
Вариант на Power Query:
Скрытый текст

В левую табличку вставляете нужные числа, потом по зеленой табличке справа жмете ПКМ и выбираете пункт Обновить.
З.Ы. Алгоритм поиска ближайшего по модулю месяца 4 назад был любезно предоставлен Андрей VG.
Изменено: PooHkrd - 16.09.2019 12:50:52
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо, огромное! То, что надо.
А как можно отключить сортировку от меньшего к большему, чтобы зеленая табличка сохраняла исходный пордок?
 
Цитата
Elensior написал:
сохраняла исходный пордок
Вот так.
Вот горшок пустой, он предмет простой...
 
Доброе время суток.
Ещё вариант
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    calcer = Table.AddColumn(Source, "temp", (rec) =>
    let
        value = rec[Количество],
        tenCount = Number.RoundUp(value / 10, 0),
        tens = {0..tenCount},
        maker = List.Transform(tens, (item) =>
        let
            dif = value - 10 * item,
            data = if dif <= 0 then
                {item, 0, Number.Abs(dif)}
            else
            let
               pair = [base = Number.RoundUp(dif / 8, 0), result1 = Number.Abs(dif - 8 * base), result2 = Number.Abs(dif - 8 * (base - 1))]
            in
                if pair[result1] < pair[result2] then
                    {item, pair[base], pair[result1]}
                else
                    {item, pair[base] - 1, pair[result2]}
        in
            data),
        min = List.Min(maker, null, (a, b) => a{2} - b{2}){2},
        return = Table.FromRows(List.Select(maker, each _{2} = min), {"10", "8", "abs dif"})
    in
        return
    ),
    #"Expanded {0}" = Table.ExpandTableColumn(calcer, "temp", {"10", "8", "abs dif"}, {"10", "8", "abs dif"})
in
    #"Expanded {0}"

Вариант Алексея что-то на одном числе 11111 у меня завис, а на 1111 выдал вместо 556 варианта, только два.
 
Цитата
Андрей VG написал:
одном числе 11111 у меня завис
Надо было, наверное, таблички Tab8 и Tab10 в буфер затащить. Иначе он при формировании записей потом со своими ленивыми вычислениями формирует декартом таблицу на мильен строк и в каждой ячейке обращается к листу.
Цитата
Андрей VG написал:
1111 выдал вместо 556 варианта, только два.
ТС просил 2, я и копал в эту сторону. Этим алгоритмом больше и не найдешь чем 2.
Да и не подумал я что их может быть больше двух.  :oops:
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Надо было, наверное, таблички Tab8 и Tab10 в буфер затащить.
Алексей, думаю, слабо поможет.  Пусть число 8000, тогда Tab10 - 800 строк, а Tab8 - 1000 строк. Декартово произведение Custom1 - это 800000 строк. В моём случае число обрабатываемых строк только 800 умноженное на два (оценка с двух сторон).
Страницы: 1
Наверх