delphi. как построить логику

Blazer

старожила
дело в том что набор 5 и 6 дальше встретится, мне необезательно его первым записать
 

Пух

كنت بلهاء
Модератор
Код:
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class FindEnum {

    private static int[] elem = {2,3,4,5,6,7,10};
    private static int M = 11;

    /*
     * Записываем в список элементы массива с индексами от 0 до end,
     * сумма которых меньше или равна M
     * @param elem - исходных упорядоченный массив
     * @param end - индекс последнего элемента массива
     * @param M - исходное число M
     * @return  - список элементов, сумма которых меньше М.
     */
    private static List<Integer> find(int[] elem, int end, int M) {
        List<Integer> list = new LinkedList<Integer>();
        for (int i = end; i >= 0; i--) {
            if (elem[i] <= M) {
                list.add(elem[i]);
                M -= elem[i];
            }
        }
        return list;
    }

    /*
     * Считаем сумму элементов списка
     * @return сумму элементов списка
     */
    private static int countSum(List<Integer> list) {
        int sum = 0;
        for (int element : list) {
            sum += element;
        }
        return sum;
    }

    public static void main(String[] args) {
        Arrays.sort(elem); //сортируем массив
        List<Integer> list = null; //список чисел, для 1 прохода массива
        /*
        список, в котором хранятся все списки, 
        найденные методом find(int[],int,int);
         */
        List<List<Integer>> saveLists = new LinkedList<List<Integer>>();

        boolean solve = false; //признак нахождения точной суммы
        int min = Integer.MAX_VALUE;

        for (int i = elem.length - 1; i >= 0; i--) {
            list = find(elem, i, M);
            if (!saveLists.contains(list)) { //если такого списка ещё не находили
                saveLists.add(list); //сохраняем этот список
                int sum = countSum(list);//считаем сумму элементов списка
                if (sum == M) { //если нашли точную сумму
                    System.out.println(list); //печатаем на экран список
                    solve = true;
                } else { 
                //если не нашли точную сумму, на всякий случай посчитаем разницу
                    if (M - sum <= min){
                        min = M - sum;
                    }
                }
            }
        }
        if (!solve) { //если точной суммы не нашли
            for (List temp : saveLists) { //проходим список списков
                //если текущий список имеет минимальную разницу с M
                if (M - countSum(temp) == min) { 
                    System.out.println(temp); //печатаем
                }
            }
        }
    }
}
Наваял быдлокод на Java. Вроде считает все правильно.
Для данного примера:
Код:
[7, 4]
[6, 5]
[5, 4, 2]
С подсветкой:

п.с. укажите на ошибки, кто шарит)
 
Зверху