У меня есть следующий набор целых чисел {2,9,4,1,8}
. Мне нужно разбить это множество на два подмножества, так что сумма множеств будет равна 14 и 10 соответственно. В моем примере ответ {2,4,8}
и {9,1}
. Я не ищу никакого кода. Я уверен, что для решения этой проблемы должен быть стандартный алгоритм. Поскольку я не был успешным в поиске в Google и узнал об этом, я отправил свой запрос здесь. Итак, какой будет лучший способ подойти к этой проблеме?Лучший подход к подгонке чисел
Моя попытка была, как это ...
public class Test {
public static void main(String[] args) {
int[] input = {2, 9, 4, 1, 8};
int target = 14;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < input.length; i++) {
stack.add(input[i]);
for (int j = i+1;j<input.length;j++) {
int sum = sumInStack(stack);
if (sum < target) {
stack.add(input[j]);
continue;
}
if (target == sum) {
System.out.println("Eureka");
}
stack.remove(input[i]);
}
}
}
private static int sumInStack(Stack<Integer> stack) {
int sum = 0;
for (Integer integer : stack) {
sum+=integer;
}
return sum;
}
}
Я знаю, что этот подход не является даже близко решить проблему
Это проблема с несколькими рюкзаками. https://en.wikipedia.org/wiki/Knapsack_problem Или проблема с упаковкой. Это немного зависит от дополнительных ограничений, которые вы не указали, например, нужно ли использовать все элементы. –
@ErwinBolwidt Все элементы должны использоваться в конце. Я задал свой вопрос, чтобы получить 2 подмножества. Мне нужен общий алгоритм, чтобы разделить родительский набор на n подмножеств, где каждое подмножество суммируется до некоторого определенного числа. –