Минимальная сдача монет (бесконечная, несвязанная) Распечатайте значения

Следующая функция получает минимальное количество монет, которое должно суммироваться или покрывать сумму. например: Если у меня есть монеты: [6,11] и мне нужно минимум монет, чтобы получить 13, тогда ответ должен быть 2 (что 11, 6), и это минимальное количество монет.

теперь мне нужно напечатать настоящие монеты, из которых состоит этот ответ.

    private int minCapacity(int capacity[], int total, Map<Integer, Integer> map)
{
    // base case 
    if (total<= 0)
    {
        return 0;
    }

    //if map contains the result means we calculated it before. Lets return that value.
    if (map.containsKey(total))
    {
        return map.get(total);
    }

    // Initialize result 
    int res = Integer.MAX_VALUE;

    for (int i = 0; i < capacity.length; i++)
    {
        //allResults.add(capacity[i]);
        int subRes = minCapacity(capacity, total- capacity[i], map);
        System.out.println("total : " + subRes + ", staff: " + capacity[i]);
        //if val we get from picking coins[i] as first coin for current total is less
        // than value found so far make it minimum.

        if (subRes < res)
        {
            res = subRes;
            coinsRes.put(total, capacity[i]);
        }

    }
    res = (res == Integer.MAX_VALUE) ? res : res + 1;

    //memoize the minimum for current total.
    map.put(total, res);
    return res;
}

Это результат:

всего: 1 -> Вместимость: 6 всего: 18 -> Вместимость: 11 всего: 2 -> Вместимость: 6 всего: 6 -> Вместимость: 6 всего: 7 -> Вместимость: 11 всего: 24 -> Вместимость: 6 всего: 12 -> Вместимость: 6 Всего: 13 -> Вместимость: 6

Теперь формула для получения номиналов должна быть следующей: Цикл до: Макс (всего) - Емкость (всего) до тех пор, пока результат не станет меньше или равен нулю.

Наименования: емкость (общая) для каждого


person user6907049    schedule 02.02.2019    source источник
comment
Это не имеет смысла для меня. Вы отметили это как проблему с рюкзаком, размен монет и динамическое программирование; но так как вы можете выйти за пределы цели (11 + 6 > 13), вам ничего из этого не нужно. Просто найдите монету самого высокого достоинства и используйте столько монет, сколько необходимо. Никакие другие монеты не актуальны.   -  person ruakh    schedule 03.02.2019


Ответы (1)


Запомните, какой элемент capacity[i] или индекс i дает лучший результат subres

Сохраните его в дополнительном поле карты.

В конце отмотайте лучшую последовательность с карты.

person MBo    schedule 02.02.2019
comment
Как раскрутить лучшую последовательность. Не могли бы вы дать фрагмент вашего ответа для получения дополнительных разъяснений. Огромное спасибо - person user6907049; 03.02.2019
comment
Окончательная запись карты результатов map.get(sum); содержит количество монет (res) и последнюю монету для достижения этого результата (coin). Теперь перейдите к записи sum-coin и повторяйте до 0 - person MBo; 03.02.2019
comment
Я попытался применить то, что вы предложили (спасибо), но это приводит к неправильному ответу. (Исправьте мой код, если я ошибаюсь) if (subRes ‹ res) { res = subRes; CoinsRes.put((res + 1), емкость[i]); } Я отредактирую его в почтовом коде для более читаемого фрагмента (Большое спасибо за вашу поддержку. Очень ценю это) - person user6907049; 03.02.2019
comment
значение capacity[i] должно соответствовать общему ключу, а не res - person MBo; 03.02.2019
comment
Я обновил пост. Поправьте меня, если я ошибаюсь или подтвердите это, пожалуйста. - person user6907049; 03.02.2019
comment
Да, теперь это выглядит более правильно. Хотя я не уверен, как вы справляетесь с суммами выше, чем требуется - person MBo; 03.02.2019