Конечно, это зависит от того, ограничена ли ваша проблема этими ограничениями, я имею в виду массив int [8], 0-31 и 3-5, но если это не так, я думаю, что ваша проблема не может быть решена по наивному алгоритму.
Я имею в виду, скажем, у нас есть этот массив:
int[] = new int[] { 2,3,4,5,6,7,8,9,10,11,12 };
и ограничение вашего подмножества, т. Е. "наборы последовательных номеров должны иметь длину не менее 3 и не более 5 номеров" .
Наивный алгоритм, который начинается с первого элемента до последнего и заполняет максимально возможное последовательное подмножество, даст следующие два подмножества:
[2,3,4,5,6] [7,8,9,10,11]
В этом решении 12 нет разделов, но, очевидно, существует другое возможное решение (на самом деле более одного), которое включает в себя все числа, например:
[2,3,4,5] [6,7,8,9] [10,11,12]
Следовательно, у вас может быть несколько возможностей:
- 1-е решение в порядке, вам не нужно как можно больше покрывать найденный последовательный набор
- Второе решение в порядке, вам нужно как можно больше покрыть найденный последовательный набор
- Второе решение в порядке, вам нужно покрыть как можно больше найденного последовательного набора и, возможно, с наименьшим возможным числом подмножества
В первом случае вы можете сделать, как указал другой ответчик (привет, Джон Скит, ответил тебе!: P).
И наоборот, во 2-м и 3-м случаях это намного сложнее, потому что это проблема типа рюкзака , т. Е. Проблема завершения NP, (в частности, 3-й случай звучит как проблема создания изменений ).
Это мои два цента, очевидно, повторяю, проблема не существует, если у вас всегда один и тот же размер массива, ограничения по диапазону и подмножеству ...