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); //печатаем
}
}
}
}
}