2016-12-25 7 views
0

私は以下の整数のセットを持っています{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つのサブセットにこのセットを分割する必要がある問題

+0

これは、複数のナップザックの問題です。 https://en.wikipedia.org/wiki/Knapsack_problemまたはビンパッキングの問題。これは、すべての要素を使用する必要があるかどうかなど、指定しなかった追加の制約に少し依存します。 –

+0

@ErwinBolwidt最後にすべての要素を使用する必要があります。私は2つのサブセットの結果があることを私の質問に述べました。親集合をn個の部分集合に分割する一般的なアルゴリズムが必要です。ここで、各部分集合は指定された数まで加算されます。 –

答えて

0

を解決するためにも近接していない知っている...このようなものでしたセットの結果はそれぞれ14と10になります。

サブセットが特定の値に合計される必要がある場合は、セット全体の合計がこれらの値の合計(つまり、例では14 + 10 = 24)であることがより適切です。 2つのサブセットを見つけ出すだけであれば問題はそれほど難しくありません - それらの値の1つに合計されたサブセットを見つけ、残りの要素は他の値と合計する必要があります。例えば

{2,9,4,1,8}、あなたが与えたセット、あなたは答えは{9,1}, {2,4,8}であると言ったが、それが唯一の答えではないことに注意してください。 {2,8}, {9,4,1}もあります。

+0

"それほど難しくない"という視点から?どのように素朴なやり方で実装するか、または問題の時間複雑さ? :-) –

+0

@Calebはい、本当にありがとうございます。最良の解決策は、すべての可能なセットをリストすることです。それを指摘してくれてありがとう –

関連する問題