Расчет среднего необходимого ряда целых чисел, равного определенному двойному - PullRequest
0 голосов
/ 01 апреля 2019

Привет! Я пытаюсь создать Java программу для генерации серии целых чисел из заданного массива, так что среднее из выбранных целых чисел равно определяемому пользователем двойному.

Теперь, скажем, Пользователь определяет цель как 46.00 .

ArrayList<Integer> usableItems = new ArrayList<>();

Здесь пользователь указывает размер и каждое целое число в массиве.Вот так.

System.out.println("Enter number of elements of usable integers: ");
int siz=0;
siz = Integer.parseInt(in.nextLine());
ArrayList<Integer> usableItems = new ArrayList<>();
for (int i=0 ; i<siz ; i++)
{
     try {
          int j = i+1;
          System.out.println("Enter element "+j+": ");
          usableItems.add(Integer.parseInt(in.nextLine()));
     } catch (Exception e)
     {
          System.out.println(e.getMessage());
          break;
     }
}

Допустим, это указанный массив:

[20,25,30,35,50]

Итак, он должен обрабатываться сейчас, чтобы я получил такой вывод:

Specified target = 46.00
Series = 50,50,50,50,30

Поскольку среднее значение вышеприведенной серии равно 46 .Число целых чисел в Series (что равно 5) не обязательно должно быть равным размеру usableItems .

Я пытался найти точное алгоритм , но я не понимаю, как это сделать.

Любой помогает / предложения несомненно приветствуются!

1 Ответ

1 голос
/ 02 апреля 2019

Рекурсивная реализация грубой силы, возвращающая кратчайший возможный ряд:

public List<Integer> matchAverage(double target, List<Integer> items) {
    for (int i = 1; i <= 50; i++) { // arbitrary limit of 50
        List<Integer> match = matchAverage(target, items, new ArrayList<>(), 0, i);
        if (match != null) return match;
    }
    throw new RuntimeException("Average not found.");
}

private List<Integer> matchAverage(double target, List<Integer> items, List<Integer> selected, int sum, int left) {
    for (int i = 0; i < items.size(); i++) {
        Integer item = items.get(i);
        selected.add(item);
        sum += item;
        if (left == 1) {
            if (sum / (double) selected.size() == target) {
                return selected;
            }
        } else {
            List<Integer> match = matchAverage(target, items.subList(i, items.size()), selected, sum, left - 1);
            if (match != null) return match;
        }
        sum -= item;
        selected.remove(selected.size() - 1);
    }
    return null;
}

Вероятно, вы можете сделать это намного быстрее, только проверяя элементы, которые приближают вас к цели.

...