Найдите только подмножество, сумма которого равна определенному значению в Java

#java #data-structures #treemap

#ява #структуры данных #древовидная карта #java

Вопрос:

У меня есть древовидная карта, в которой у меня есть ключи, все ее значения и целевое значение.Ниже приведен мой подход. В основном это поиск подмножества. Но здесь мне нужны ключи значений, которые суммируются с целью. Я применил рекурсивный подход. Здесь я хочу завершить рекурсию, если получу какое-либо одно подмножество. Есть ли какой-нибудь оптимальный способ решить эту проблему? Примечание:- Значения будут намного больше, и у меня будут сотни данных.

 import java.util.*;
public class SubsetFromATree {
    public static void main(String[] args) {
        TreeMap<Integer,Integer> tm = new TreeMap<Integer,Integer>() ;
        tm.put(0, 3);
        tm.put(1, 4);
        tm.put(2, 5);
        tm.put(3, 6);
//      for(int i =0;i<20;i  ) {
//          tm.put(i, i 1);
//      }
        ArrayList<Integer> ans = new ArrayList<>();
        ArrayList<Integer> out = new ArrayList<>();
        StringBuffer s = new StringBuffer("0");
        subset(tm,10,out,tm.size(),s,ans);
        System.out.println(ans);
    }

    private static void subset(TreeMap<Integer, Integer> tm, int tsum, ArrayList<Integer> out, int size, StringBuffer val,
            ArrayList<Integer> ans) {
        // TODO Auto-generated method stub
        if(tsum == 0) {
            val.append("1");
            for(int i = 0;i<out.size();i  ) {
                ans.add(out.get(i));
            }
            return;
        }
        if(size == 0 || val.equals("1")) {
            return;
        }
        //Not including
        subset(tm,tsum,out,size-1,val,ans);
        ArrayList<Integer> output = new ArrayList<>(out);
        output.add(tm.get(size-1));
        subset(tm,tsum-tm.get(size-1),output,size-1,val,ans);
        return;
        
    }

}

  

Комментарии:

1. Эффективного способа решить эту проблему не существует; сумма подмножества является NP-полной и займет экспоненциальное время.

2. Нет ли какого-либо способа, чтобы, если мы достигнем целевой суммы, оттуда мы закончим всю рекурсию?

3. Это, безусловно, выполнимо, да. Например, вы могли бы вернуть boolean указание, нашли ли вы правильное решение, вместо того, чтобы иметь void функцию.

4. Для этого я попытался использовать StringBuffer, чтобы, если значение стало 1, это завершило рекурсию, но это не работает.

5. val.equals("1") никогда не будет истинным, потому что a StringBuffer не равно a String .