Сортировать массив, который приводит к максимальному произведению элементов

1

Я работаю над проблемой, которая включает в себя принятие целочисленного массива в качестве ввода от пользователя. Программа вычисляет произведение элементов массива. Расчет идет следующим образом: например, пусть вход будет 56, 61, 2. Затем программа сначала выполняет 56 * 61 = 3416, затем modulo 3416 with 199 = 33. Теперь возьмите следующий элемент массива, т.е. 2, и умножьте его на 33 = 66. Результат будет 3416 + 33 = 3482. Это расчет isotopes atom. Теперь, если мы можем переставить элементы массива, т.е. 61, 2, 56; мы могли бы достичь максимального продукта следующим образом:

61 * 2 = 122
122 * 56 = 6832
6832 + 122 = 6954

Я написал программу, которая явно вычисляет произведение входного массива, но теперь я хочу отсортировать массив, как указано выше. Моя программа выглядит следующим образом:

import java.util.*;
public class codevita1 {
    public static void main (String []args) {
        int num = 0;
        try {
            num = Integer.parseInt (args[0]);
        } catch (Exception e) {
            System.err.println ("Arguments not enough");
        }
        int arr[] = new int[num];
        for (int i = 1; i <= num; i++) {
            arr[i-1] = Integer.parseInt(args[i]);
        }
        new codevita1().calcEnery (arr);
    }

    private int calcEnergy (int elements[]) {
    int energy = 0;
    int t = 1;
    for (int i = 0; i < elements.length; i++) {
        if (i == 0) {
            energy = (elements[i] * elements[++i]);
        } else {
            energy += (t * elements[i]);
        }
        t = energy % 199;
    }
    return energy;
}
}

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

  • 0
    Не могли бы вы немного подробнее объяснить строку вашего поста о «Теперь, если мы сможем переставить элементы массива, т. Е. 61, 2, 56; мы могли бы добиться максимального результата следующим образом:« потому что эта строка уже у вас есть » Результат будет 3416 + 33 = 3482 "
  • 0
    Наблюдайте за последовательностью элементов перед первым результатом, то есть 56, 61, 2, и наблюдайте за последовательностью элементов после первого результата, то есть 61, 2, 56. Операция выполняется только последовательно (как в массиве).
Показать ещё 6 комментариев
Теги:
arrays
algorithm
sorting
dynamic-programming

1 ответ

1

Наивный подход - проверить каждую перестановку, и это займет время O (n!).

Также вы можете заметить, что (% 199 * b)% 199 = (a * b)% 199 Это позволяет нам проверять каждый способ разбить набор чисел на два почти равных подмножества. Когда мы проверяем способы разделения, мы можем вычислить t, который остается после вычисления энергии для первого подмножества как всего лишь продукта всех чисел в первом подмножестве% 199, он останется постоянным независимо от порядка элементов в подмножестве. Тогда мы можем рекурсивно вычислить оптимальный порядок для обоих подмножеств.

Существуют C (n, n/2) способы разбить n чисел в двух подмножествах, если имеет место порядок подмножеств. C (n, n/2) <2 ^ n, поэтому общее число операций меньше 2 ^ n * 2 * 2 ^ (n/2) * 4 * 2 ^ (n/4) * 8 * 2 ^ (n/8) *... * 2 ^ (log (n)/2) * 2 ^ (2) * 2 ^ (log (n)) * 2 ^ 1, которая равна ~ 2 ^ (2 * n + 2 * log (n)), который равен O (2 ^ n), так что все еще очень медленно, но лучше, чем n!

Я подозреваю, что гораздо лучше разбить на большее количество подмножеств (точнее, sqrt (n) подмножества элементов sqrt (n) в каждом), но еще не вычислил сложность для этого случая.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню