私は以下の整数のセットを持っています{2,9,4,1,8}
。このセットを2つのサブセットに分割して、セットの合計がそれぞれ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;
}
}
私はこのアプローチは、私が合計ように2つのサブセットにこのセットを分割する必要がある問題
これは、複数のナップザックの問題です。 https://en.wikipedia.org/wiki/Knapsack_problemまたはビンパッキングの問題。これは、すべての要素を使用する必要があるかどうかなど、指定しなかった追加の制約に少し依存します。 –
@ErwinBolwidt最後にすべての要素を使用する必要があります。私は2つのサブセットの結果があることを私の質問に述べました。親集合をn個の部分集合に分割する一般的なアルゴリズムが必要です。ここで、各部分集合は指定された数まで加算されます。 –