다음과 같은 정수가 {2,9,4,1,8}
입니다. 이 집합을 두 개의 하위 집합으로 나눠서 집합의 합이 각각 14와 10이되도록해야합니다. 내 예제에서는 대답은 {2,4,8}
과 {9,1}
입니다. 나는 어떤 코드도 찾고 있지 않다. 나는이 문제를 해결하기위한 표준 알고리즘이 있어야한다고 확신한다. 인터넷 검색에 성공하지 못해서 혼자만 찾았 기 때문에 여기에 내 질문을 올렸습니다. 그렇다면이 문제에 접근하는 가장 좋은 방법은 무엇일까요?숫자에 가장 잘 맞는 방법
내 시도는 내가이 방법을 알고
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 개의 하위 집합으로 나눌 수있는 일반 알고리즘이 필요합니다. 여기서 각 하위 집합은 지정된 개수까지만 합산됩니다. –